<!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/544167#544167">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>Another observation is that quite a few calls to JavassistMethodInfo.getParameterTypes() are only interested in the length of the parameters and the names of the parameter types, so it might be an idea to return an array of "lazy" type infos which only know the name and the declaring typeinfo. I can be found out easily from the raw method signature (I am already passing the SignatureKey into JavassistMethodInfo and using that in its equals() method to avoid having to load parameters there). Once something more advanced is called, then that could obtain the real typeinfo and delegate to that. I'm not 100% sure yet if this is what I want to do.</p></blockquote><p>I've looked more into this and will try out "lazy" type infos. When constructing the BeanInfos, it goes through and calls MethodInfo.getReturnType() and MethodInfo.getParameterTypes(). These calls are really heavy, and at least for this use-case we don't care about anything apart from the name. Behind the scenes, what happens for each parameter is: </p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>a) It hits the classpool to load the CtClass</p><p>b) When creating the type info it needs to check if the class is an enum or annotation, the first time you call anything apart from CtClass.getName() it needs to load the underlying ClassFile. This is slow, but initialises the CtClass for future use. </p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>a) and b) seem to take about the same time, although b) probably varies with class size. I don't think we can do much about b) apart from trying to avoid it at all costs.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Another observation in favour of optimizing the classpools further is needing to do this in JavassistTypeInfoFactory.get() (pseudocode)</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><pre class="jive-pre"><code class="jive-code jive-java"><font color="navy"><b>public</b></font> TypeInfo get(ClassLoader cl, String name)<font color="navy">{</font>
&#160;
&#160;&#160;&#160; Cache cache = getCacheForLoader(cl);
&#160;&#160;&#160; TypeInfo info = cache.get(name);
&#160;&#160;&#160; <font color="navy"><b>if</b></font> (info != <font color="navy"><b>null</b></font>)
&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>return</b></font> info;
&#160;
&#160;&#160;&#160; <font color="darkgreen">//The passed in classloader is not necessarily the one where the class lives,</font>
&#160;&#160;&#160; <font color="darkgreen">//so we need to hit the pool to find out where it comes from</font>
&#160;&#160;&#160; ClassPool pool = getPoolForLoader(cl);
&#160;&#160;&#160; CtClass clazz = pool.get(name);
&#160;
&#160;&#160;&#160; <font color="navy"><b>if</b></font> (clazz.getClassPool().getClassLoader() != cl)
&#160;&#160;&#160; <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160; cl = clazz.getClassPool().getClassLoader(); 
&#160;&#160;&#160;&#160;&#160;&#160; cache = getCacheForLoader(cl);
&#160;&#160;&#160;&#160;&#160;&#160; info = cache.get(name);
&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>if</b></font> (info != <font color="navy"><b>null</b></font>)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>return</b></font> info;
&#160;&#160;&#160; <font color="navy">}</font>
&#160;
&#160;&#160;&#160; info = instantiate(clazz);
&#160;&#160;&#160; cache.cache(info);
&#160;
&#160;&#160; <font color="navy"><b>return</b></font> info;
<font color="navy">}</font>
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>We need to query the pool to figure out the correct classloader</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/544167#544167">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>