[jboss-jira] [JBoss JIRA] (JASSIST-239) javassist.CannotCompileException: [source error] Method m is private

Eric Nielsen (JIRA) issues at jboss.org
Mon Dec 15 19:26:30 EST 2014


    [ https://issues.jboss.org/browse/JASSIST-239?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13027798#comment-13027798 ] 

Eric Nielsen commented on JASSIST-239:
--------------------------------------

Oh, sorry. The problem is that I'm trying to call a private method in {{A}} from class {{B}}.

> javassist.CannotCompileException: [source error] Method m is private
> --------------------------------------------------------------------
>
>                 Key: JASSIST-239
>                 URL: https://issues.jboss.org/browse/JASSIST-239
>             Project: Javassist
>          Issue Type: Enhancement
>    Affects Versions: 3.18.2-GA
>            Reporter: Eric Nielsen
>            Assignee: Shigeru Chiba
>
> Given these classes:
> {code}
> public abstract class A {
>     public static void m() {
>         return m(aClass());
>     }
>     private static void m(Class<? extends A> aClass) {
>         // some logic here
>     }
>     private static Class<? extends A> aClass() {
>         // some logic here, subclasses will have own implementation
>     }
> }
> public class B extends A {
> }
> {code}
> I'm writing instrumentation for subclasses of {{A}} (like {{B}} above). The code is something like:
> {code}
> // source is class A, target is subclass of A
> private void instrument(CtClass source, CtClass target) 
>         throws NotFoundException, CannotCompileException {
>     CtMethod[] sourceMethods = source.getDeclaredMethods();
>     for (CtMethod method : sourceMethods) {
>         int modifiers = method.getModifiers();
>         if (Modifier.isStatic(modifiers)) {
>             CtMethod newMethod;
>             if (Modifier.isPublic(modifiers) 
>                     || Modifier.isProtected(modifiers)) {
>                 newMethod = CtNewMethod.copy(method, target, null);
>                 StringBuilder body = new StringBuilder().append("{ ");
>                 if (!CtClass.voidType.equals(method.getReturnType())) {
>                     body.append("return ");
>                 }
>                 body.append(method.getName()).append("(aClass()");
>                 if (method.getParameterTypes().length > 0) {
>                     body.append(", $$");
>                 }
>                 body.append("); }");
>                 newMethod.setBody(body.toString());
>             } else if ("aClass".equals(method.getName())) {
>                 newMethod = CtNewMethod.copy(method, target, null);
>                 newMethod.setBody("{ return " 
>                         + target.getName() + ".class; }");
>             } else {
>                 newMethod = CtNewMethod.delegator(method, target);
>             }
>             // include the generic signature
>             for (Object attr : method.getMethodInfo().getAttributes()) {
>                 if (attr instanceof SignatureAttribute) {
>                     newMethod.getMethodInfo().addAttribute(
>                             (SignatureAttribute) attr);
>                 }
>             }
>             target.addMethod(newMethod);
>         }
>     }
> }
> {code}
> I want to achieve the result below with the instrumentation:
> {code}
> public class B extends A {
>     public static void m() {
>         return m(aClass()); // a copy of superclass code
>     }
>     private static void m(Class<? extends A> aClass) {
>         super.m(aClass); // delegates to superclass
>     }
>     private static Class<? extends A> aClass() {
>         return B.class; // returns this class
>     }
> }
> {code}
> So when calling {{B.m()}}, the logic in the {{m(Class)}} superclass method will run receiving {{B.class}} as parameter.
> When running instrumentation, I get the following error message:
> {code}
> javassist.CannotCompileException: [source error] Method m is private
> {code}
> What's wrong?



--
This message was sent by Atlassian JIRA
(v6.3.11#6341)


More information about the jboss-jira mailing list