<!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">JBoss 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;">
Problem with equals/hashCode?
</h3>
<span style="margin-bottom: 10px;">
created by <a href="http://community.jboss.org/people/jgarrison">James Garrison</a> in <i>Javassist</i> - <a href="http://community.jboss.org/message/582176#582176">View the full discussion</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">
<div class="jive-rendered-content"><p>When MethodHandler.invoke() is called by Javassist for invocations of equals() and hashCode(), the "proceed" method object is not named "equals" or "hashCode", but is instead something like _d2hashCode.  This is different from normal method invocation where the proceed method is the superclass implementation.  Why does the generated proxy provide an implementation of these two methods?</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>We're trying to implement a proxy wrapper for an object that implements its own hashCode and equals, and would like to detect this situation so as to delegate to the wrapped object's equals() and hashCode().  Since the method name is mangled, what can we rely on to detect this situation unequivocally?  What I've come up with is the following, to determine the actual implementation class for equals() and hashCode().</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><span style="font-family: courier new,courier; font-size: 8pt;">        private Class<?> getRealDeclaringClass(Method m) throws NoSuchMethodException</span></p><p><span style="font-family: courier new,courier; font-size: 8pt;">        {</span></p><p><span style="font-family: courier new,courier; font-size: 8pt;">            Class<?> dcl = m.getDeclaringClass();</span></p><p><span style="font-family: courier new,courier; font-size: 8pt;">            String name = m.getName().contains("equals") ? "equals" : m.getName().contains("hashCode") ? "hashCode" : null;</span></p><p><span style="font-family: courier new,courier; font-size: 8pt;">            if (name != null)</span></p><p><span style="font-family: courier new,courier; font-size: 8pt;">            {</span></p><p><span style="font-family: courier new,courier; font-size: 8pt;">                Method impl = m.getDeclaringClass().getSuperclass().getMethod(name,m.getParameterTypes());</span></p><p><span style="font-family: courier new,courier; font-size: 8pt;">                dcl = impl.getDeclaringClass();</span></p><p><span style="font-family: courier new,courier; font-size: 8pt;">            }</span></p><p><span style="font-family: courier new,courier; font-size: 8pt;">            return dcl;</span></p><p><span style="font-family: courier new,courier; font-size: 8pt;">        }</span></p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><span style="font-family: courier new,courier; font-size: 8pt;"><span style="font-family: arial,helvetica,sans-serif; font-size: 10pt;">Is this correct?</span><br/></span></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/582176#582176">going to Community</a></p>
        <p style="margin: 0;">Start a new discussion in Javassist at <a href="http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2062">Community</a></p>
</div></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>