<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body link="#355491" alink="#4262a1" vlink="#355491" style="background: #e2e2e2; margin: 0; padding: 20px;">

<div>
        <table cellpadding="0" bgcolor="#FFFFFF" border="0" cellspacing="0" style="border: 1px solid #dadada; margin-bottom: 30px; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                <tbody>
                        <tr>

                                <td>

                                        <table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" style="border: solid 2px #ccc; background: #dadada; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                                                <tbody>
                                                        <tr>
                                                                <td bgcolor="#000000" valign="middle" height="58px" style="border-bottom: 1px solid #ccc; padding: 20px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 5px; -webkit-border-top-left-radius: 5px;">
                                                                        <h1 style="color: #333333; font: bold 22px Arial, Helvetica, sans-serif; margin: 0; display: block !important;">
                                                                        <!-- To have a header image/logo replace the name below with your img tag -->
                                                                        <!-- Email clients will render the images when the message is read so any image -->
                                                                        <!-- must be made available on a public server, so that all recipients can load the image. -->
                                                                        <a href="http://community.jboss.org/index.jspa" style="text-decoration: none; color: #E1E1E1">Community</a></h1>
                                                                </td>

                                                        </tr>
                                                        <tr>
                                                                <td bgcolor="#FFFFFF" style="font: normal 12px Arial, Helvetica, sans-serif; color:#333333; padding: 20px;  -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 5px; -webkit-border-bottom-left-radius: 5px;"><h3 style="margin: 10px 0 5px; font-size: 17px; font-weight: normal;">
    JBoss Reflect Performance Javassist vs Introspection
</h3>
<span style="margin-bottom: 10px;">
    reply from <a href="http://community.jboss.org/people/kabir.khan%40jboss.com">Kabir Khan</a> in <i>JBoss Microcontainer Development</i> - <a href="http://community.jboss.org/message/538809#538809">View the full discussion</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">

<div class="jive-rendered-content"><blockquote class="jive-quote"><p>Kabir Khan wrote:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>I have modified the bootstrap project as shown in the attached patch to set JavassistTypeInfoFactoryImpl's classPoolFactory to be RepositoryClassPoolFactory. A quick check in the debugger shows this to kick in.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>I am now getting some exceptions on startup that I need to look into.</p></blockquote><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>I modified JavassistTypeInfoFactoryImpl to give some extra output. When a class can not be found it ends up in this method:</p><pre class="jive-pre"><code class="jive-code jive-java">&#160;&#160; <font color="navy"><b>private</b></font> TypeInfo delegateToIntrospectionImplementation(ClassLoader cl, String name) <font color="navy"><b>throws</b></font> ClassNotFoundException
&#160;&#160; <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160; System.out.println(<font color="red">"======&gt; "</font> + name + <font color="red">" "</font> + cl);
&#160;
&#160;&#160;&#160;&#160;&#160; <font color="darkgreen">//Extra code just for debugging</font>
&#160;&#160;&#160;&#160;&#160; ClassPool pool = poolFactory.getPoolForLoader(cl);
&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>try</b></font>
&#160;&#160;&#160;&#160;&#160; <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CtClass ct = pool.get(name); 
&#160;&#160;&#160;&#160;&#160; <font color="navy">}</font>
&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>catch</b></font>(Exception alreadyHandled)
&#160;&#160;&#160;&#160;&#160; <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(<font color="red">"---&gt; Not found in "</font> + pool);
&#160;&#160;&#160;&#160;&#160; <font color="navy">}</font>
&#160;
&#160;&#160;&#160;&#160;&#160; Class&lt;?&gt; clazz = cl.loadClass(name);
&#160;&#160;&#160;&#160;&#160; System.out.println(<font color="red">"---&gt; Loaded real class from "</font> + clazz.getClassLoader());
&#160;
&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>try</b></font>
&#160;&#160;&#160;&#160;&#160; <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CtClass ct = pool.get(name); 
&#160;&#160;&#160;&#160;&#160; <font color="navy">}</font>
&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>catch</b></font>(Exception alreadyHandled)
&#160;&#160;&#160;&#160;&#160; <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(<font color="red">"---&gt; Not found again in "</font> + pool);
&#160;&#160;&#160;&#160;&#160; <font color="navy">}</font>
&#160;
&#160;&#160;&#160;&#160;&#160; pool = poolFactory.getPoolForLoader(clazz.getClassLoader());
&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>try</b></font>
&#160;&#160;&#160;&#160;&#160; <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CtClass ct = pool.get(name); 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(<font color="red">"---&gt; Found in actual pool "</font> + pool);
&#160;&#160;&#160;&#160;&#160; <font color="navy">}</font>
&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>catch</b></font>(Exception alreadyHandled)
&#160;&#160;&#160;&#160;&#160; <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(<font color="red">"---&gt; Not found in actual pool "</font> + pool);
&#160;&#160;&#160;&#160;&#160; <font color="navy">}</font>
&#160;
&#160;
&#160;&#160;&#160;&#160;&#160; <font color="darkgreen">//Extra code - END</font>
&#160;
&#160;&#160;&#160;&#160;&#160; IntrospectionTypeInfoFactory factory = <font color="navy"><b>new</b></font> IntrospectionTypeInfoFactory();
&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>return</b></font> factory.getTypeInfo(name, cl);
&#160;&#160; <font color="navy">}</font>
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Here is the output, this is during installing the beans from conf/bootstrap</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><pre class="jive-pre"><code class="jive-code">17:16:06,954 INFO&#160; [JMXKernel] Legacy JMX core initialized
17:16:07,009 INFO&#160; [STDOUT] ======&gt; org.jboss.aop.deployers.AspectManagerJMXRegistrar BaseClassLoader@47ac1adf{jmx-classloader:0.0.0$MODULE}
17:16:08,927 INFO&#160; [STDOUT] ---&gt; Not found in [org.jboss.classpool.plugins.jbosscl.JBossClDelegatingClassPool@2002512083 [class path: BaseClassLoader@47ac1adf{jmx-classloader:0.0.0$MODULE}:] - dcl:BaseClassLoader@47ac1adf{jmx-classloader:0.0.0$MODULE} domain: [org.jboss.classpool.plugins.jbosscl.JBossClClassPoolDomain@101ebf5c name:DefaultDomain]]
17:16:08,930 INFO&#160; [STDOUT] ---&gt; Loaded real class from BaseClassLoader@8a85268{aop-classloader:0.0.0$MODULE}
17:16:08,931 INFO&#160; [STDOUT] ---&gt; Not found again in [org.jboss.classpool.plugins.jbosscl.JBossClDelegatingClassPool@2002512083 [class path: BaseClassLoader@47ac1adf{jmx-classloader:0.0.0$MODULE}:] - dcl:BaseClassLoader@47ac1adf{jmx-classloader:0.0.0$MODULE} domain: [org.jboss.classpool.plugins.jbosscl.JBossClClassPoolDomain@101ebf5c name:DefaultDomain]]
17:16:08,931 INFO&#160; [STDOUT] ---&gt; Found in actual pool org.jboss.classpool.spi.AbstractClassPool@697579067 [class path: BaseClassLoader@8a85268{aop-classloader:0.0.0$MODULE}:] - dcl:BaseClassLoader@8a85268{aop-classloader:0.0.0$MODULE}
17:16:09,563 INFO&#160; [STDOUT] ======&gt; org.jboss.aop.asintegration.jboss5.AOPAnnotationMetaDataParserDeployer BaseClassLoader@280bca{deployers-classloader:0.0.0$MODULE}
17:16:10,283 INFO&#160; [STDOUT] ---&gt; Not found in [org.jboss.classpool.plugins.jbosscl.JBossClDelegatingClassPool@404225673 [class path: BaseClassLoader@280bca{deployers-classloader:0.0.0$MODULE}:] - dcl:BaseClassLoader@280bca{deployers-classloader:0.0.0$MODULE} domain: [org.jboss.classpool.plugins.jbosscl.JBossClClassPoolDomain@101ebf5c name:DefaultDomain]]
17:16:10,287 INFO&#160; [STDOUT] ---&gt; Loaded real class from BaseClassLoader@8a85268{aop-classloader:0.0.0$MODULE}
17:16:10,289 INFO&#160; [STDOUT] ---&gt; Not found again in [org.jboss.classpool.plugins.jbosscl.JBossClDelegatingClassPool@404225673 [class path: BaseClassLoader@280bca{deployers-classloader:0.0.0$MODULE}:] - dcl:BaseClassLoader@280bca{deployers-classloader:0.0.0$MODULE} domain: [org.jboss.classpool.plugins.jbosscl.JBossClClassPoolDomain@101ebf5c name:DefaultDomain]]
17:16:10,289 INFO&#160; [STDOUT] ---&gt; Found in actual pool org.jboss.classpool.spi.AbstractClassPool@697579067 [class path: BaseClassLoader@8a85268{aop-classloader:0.0.0$MODULE}:] - dcl:BaseClassLoader@8a85268{aop-classloader:0.0.0$MODULE}



</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>As you can see AspectManagerJMXRegistrar is loaded from the classloader used to install jmx.xml, and AOPAnnotationMetaDataParserDeployer from deployers.xml's classloader. If I use the pools for those loaders directly I get a NotFoundException. If I try to load the class from the loader directly it works, and in both cases the classes returned are loaded from the classloader used for aop.xml&#160; (AspectManagerJMXRegistrar comes from jboss-aop-asintegration-core.jar, and AOPAnnotationMetaDataParserDeployer comes from jboss-aop-deployers.jar).</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Next I get an error that brings everything to a halt (with some extra debug information compared to the error message that is in svn):</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p><pre class="jive-pre"><code class="jive-code">17:16:13,036 ERROR [AbstractKernelController] Error installing to PreInstall: name=AOPClassLoaderDeployer state=Real: java.lang.NoClassDefFoundError: Unable to find class org.jboss.aop.asintegration.jboss5.AOPClassLoaderDeployer from org.jboss.osgi.integration.jbossas.AOPClassLoaderDeployerJBAS7909 in pool [org.jboss.classpool.plugins.jbosscl.JBossClDelegatingClassPool@404225673 [class path: BaseClassLoader@280bca{deployers-classloader:0.0.0$MODULE}:] - dcl:BaseClassLoader@280bca{deployers-classloader:0.0.0$MODULE} domain: [org.jboss.classpool.plugins.jbosscl.JBossClClassPoolDomain@101ebf5c name:DefaultDomain]]
&#160;&#160;&#160;&#160;&#160;at org.jboss.reflect.plugins.javassist.JavassistTypeInfoFactoryImpl.raiseClassNotFound(JavassistTypeInfoFactoryImpl.java:104) [jboss-reflect.jar:2.2.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at org.jboss.reflect.plugins.javassist.JavassistTypeInfo.getSuperclass(JavassistTypeInfo.java:235) [jboss-reflect.jar:2.2.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at org.jboss.beans.info.plugins.AbstractBeanInfoFactory.getMethods(AbstractBeanInfoFactory.java:262) [jboss-reflect.jar:2.2.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at org.jboss.beans.info.plugins.AbstractBeanInfoFactory.getBeanInfo(AbstractBeanInfoFactory.java:152) [jboss-reflect.jar:2.2.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at org.jboss.config.plugins.AbstractConfiguration.getBeanInfo(AbstractConfiguration.java:87) [jboss-reflect.jar:2.2.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at org.jboss.kernel.plugins.config.AbstractKernelConfig.getBeanInfo(AbstractKernelConfig.java:80) [jboss-kernel.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.kernel.plugins.config.AbstractKernelConfigurator.getBeanInfo(AbstractKernelConfigurator.java:78) [jboss-kernel.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.kernel.plugins.config.AbstractKernelConfigurator.getBeanInfo(AbstractKernelConfigurator.java:97) [jboss-kernel.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.kernel.plugins.dependency.PreInstallAction.installActionInternal(PreInstallAction.java:88) [jboss-kernel.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:54) [jboss-kernel.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:42) [jboss-kernel.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:377) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:2042) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:1081) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.AbstractController.executeOrIncrementStateDirectly(AbstractController.java:1320) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1244) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1137) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:892) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:639) [jboss-dependency.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.deployBean(AbstractKernelDeployer.java:319) [jboss-kernel.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.deployBeans(AbstractKernelDeployer.java:297) [jboss-kernel.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.deploy(AbstractKernelDeployer.java:130) [jboss-kernel.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.kernel.plugins.deployment.BasicKernelDeployer.deploy(BasicKernelDeployer.java:76) [jboss-kernel.jar:2.2.0.Alpha9]
&#160;&#160;&#160;&#160;&#160;at org.jboss.bootstrap.impl.mc.deployer.TempBasicXMLDeployer.deploy(TempBasicXMLDeployer.java:92) [jboss-bootstrap-impl-mc.jar:2.1.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at org.jboss.bootstrap.impl.mc.deployer.TempBasicXMLDeployer.deploy(TempBasicXMLDeployer.java:193) [jboss-bootstrap-impl-mc.jar:2.1.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at org.jboss.bootstrap.impl.mc.server.AbstractMCServerBase.bootstrapMcAndDescriptors(AbstractMCServerBase.java:318) [jboss-bootstrap-impl-mc.jar:2.1.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at org.jboss.bootstrap.impl.mc.server.AbstractMCServerBase.doStart(AbstractMCServerBase.java:265) [jboss-bootstrap-impl-mc.jar:2.1.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at org.jboss.bootstrap.impl.as.server.AbstractJBossASServerBase.doStart(AbstractJBossASServerBase.java:381) [jboss-bootstrap-impl-as.jar:2.1.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at org.jboss.bootstrap.impl.base.server.AbstractServer$StartServerTask.run(AbstractServer.java:413) [jboss-bootstrap-impl-base.jar:2.1.0-SNAPSHOT]
&#160;&#160;&#160;&#160;&#160;at java.lang.Thread.run(Thread.java:637) [:1.6.0_17]
</code></pre><div> </div><div>This is caused by a call to CtClass.getSuperClass() for org.jboss.osgi.integration.jbossas.AOPClassLoaderDeployerJBAS7909 which has the deployers.xml classpool, but the superclass lives in the aop.xml classpool.</div><div> </div><div>So something is going wrong during bootstrap, and it looks like the classpools can't see classes from the other pools within the domain, while the classloaders can see classes from the other loaders in the domain. What is weird is that from bootstrap.xml it looks like the RegisterModuleCallback (from aop.xml) should be deployed before jmx.xml and deployers.xml, but could there be anything else missing at this stage?</div><div> </div><pre class="jive-pre"><code class="jive-code jive-xml"><span class="jive-xml-tag">&lt;bootstrap xmlns="urn:jboss:bootstrap:1.0"&gt;</span>
&#160;&#160; <span class="jive-xml-tag">&lt;url&gt;</span>bootstrap/vfs.xml<span class="jive-xml-tag">&lt;/url&gt;</span>
&#160;&#160; <span class="jive-xml-tag">&lt;url&gt;</span>bootstrap/classloader.xml<span class="jive-xml-tag">&lt;/url&gt;</span>
&#160;&#160; <span class="jive-xml-tag">&lt;url&gt;</span>bootstrap/stdio.xml<span class="jive-xml-tag">&lt;/url&gt;</span>
&#160;&#160; <span class="jive-xml-tag">&lt;url&gt;</span>bootstrap/kernel.xml<span class="jive-xml-tag">&lt;/url&gt;</span>
&#160;&#160; <span class="jive-xml-tag">&lt;url&gt;</span>bootstrap/aop.xml<span class="jive-xml-tag">&lt;/url&gt;</span>
&#160;&#160; <span class="jive-xml-tag">&lt;url&gt;</span>bootstrap/jmx.xml<span class="jive-xml-tag">&lt;/url&gt;</span>
&#160;&#160; <span class="jive-xml-tag">&lt;url&gt;</span>bootstrap/deployers.xml<span class="jive-xml-tag">&lt;/url&gt;</span>
&#160;&#160; <span class="jive-xml-tag">&lt;url&gt;</span>bootstrap/profile.xml<span class="jive-xml-tag">&lt;/url&gt;</span>
<span class="jive-xml-tag">&lt;/bootstrap&gt;</span>

</code></pre><div> </div></p></div>

<div style="background-color: #f4f4f4; padding: 10px; margin-top: 20px;">
    <p style="margin: 0;">Reply to this message by <a href="http://community.jboss.org/message/538809#538809">going to Community</a></p>
        <p style="margin: 0;">Start a new discussion in JBoss Microcontainer Development at <a href="http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2115">Community</a></p>
</div></td>
                        </tr>
                    </tbody>
                </table>


                </td>
            </tr>
        </tbody>
    </table>

</div>

</body>
</html>