<!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="https://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;">
    Javassist seems to be stripping off existing annotations - why?
</h3>
<span style="margin-bottom: 10px;">
    created by <a href="https://community.jboss.org/people/cuginip">Paul Cugini</a> in <i>Javassist</i> - <a href="https://community.jboss.org/message/739662#739662">View the full discussion</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">

<div class="jive-rendered-content"><p>Hello.&#160;&#160; I'm trying to use Javassist in a jUnit test.&#160;&#160; My objective is to create a dynamic class based on an existing class, for the purposes of dynamically adding an annotation.&#160;&#160; In my test I'm also replacing the method body of one of the methods of the original class.&#160;&#160; This basically seems to work.&#160; However I've noticed something which is very annoying and which has hindered my progress.&#160; It seems as though when javassist is creating the new class based on the specified original, all of the existing annotations on the existing class are stripped off in the new dynamic class created by Javassist.&#160; This seems to be occurring even when my code doesn't include any modifications to the annotations on the original.&#160; The only way I've seen to get around this is to re-add all of the annotations that need to be there, but this is very cumbersome.&#160; The version of javassist I'm using is 3.12.&#160;&#160; I'm wondering if this is a known issue, or if perhaps I'm doing something wrong that is causing this to happen.&#160; </p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Here is a snippet of my code:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>@Test</p><p>public testCase {</p><p>...</p><p>Class newClass = buildClassWithMethod(ExistingClass.class, "getRecordClass", "{return + dynamicBeanClass.getName() +&#160; ".class";}");</p><p>...</p><p>Method controlInitMethod = getInitMethod(ExistingClass.class);</p><p>ExistingAnnotation controlExistingAnnotation = controlInitMethod.getAnnotation(ExistingAnnotation.class);</p><p>Assert.assertNotNull(controlExistingAnnotation); // PASSES as expected.</p><p>Method initMethod = getInitMethod(newClass);</p><p>ExistingAnnotation existingAnnot = initMethod.getAnnotation(ExistingAnnotation.class);</p><p>Assert.assertNotNull(existingAnnot); // FAILS!</p><p>...</p><p>}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>private Class buildClassWithMethod(Class originalClass,</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; String newMethodName,</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Stirng newMethodText) throws Exception {</p><p>ClassPool pool = ClassPool.getDefault();</p><p>Loader loader = new Loader(pool);</p><p>pool.insertClassPath(new ClassClassPath(originalClass));</p><p>CtClass cc = pool.getCtClass(originalClass.getName());</p><p>CtMethod methodToReplace = cc.getDeclaredMethod(newMethodName);</p><p>methodToReplace.setBody(newMethodText);</p><p>ClassFile ccFile = cc.getClassFile();</p><p>ConstPool constpool = ccFile.getConstPool();</p><p>Class dynamicBeanClass = cc.toClass(loader, null);</p><p>return dynamicBeanClass;</p><p>}</p></div>

<div style="background-color: #f4f4f4; padding: 10px; margin-top: 20px;">
    <p style="margin: 0;">Reply to this message by <a href="https://community.jboss.org/message/739662#739662">going to Community</a></p>
        <p style="margin: 0;">Start a new discussion in Javassist at <a href="https://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>