2014-01-31 302 views
1

我正在使用Javassist在运行时生成一些类,当我在这些类中创建匿名内部类时,它们在尝试实例化一个封闭对象时崩溃(据我所知)Javassist生成的类中的匿名内部类问题

我试图实现我想要做的最简单的版本。

我定义了3类如下:

public class A { 

    public int method() { 
     return 1; 
    } 
} 

public class B extends A { 

} 

public class C extends A { 
    public int method() { 
     return 5; 
    } 
} 

我想现在要做的是使用了Javassist(或别的东西,我猜的)到(在运行时)生成具有所有的C的功能的类但扩展B的替代,对我来说这似乎是会被罚款的事情,因为B扩展答:目前我做这个如下:

ClassPool cp = ClassPool.getDefault(); 
CtClass cc = cp.get(C.class.getName()); 

cc.setName("newName"); 
cc.setSuperclass(cp.get(B.class.getName())); 

B b = (B) cc.toClass().newInstance(); 

b.method(); 

上面的代码工作正常,当我打电话的方法( ),但如果我在C的方法()中实例化一个匿名的内部类,如下所示:

public class C extends A { 
    public int method() { 
     try { 
      return new Callable<Integer>() { 

       @Override 
       public Integer call() throws Exception { 
        return 5; 
       } 

      }.call(); 
     } catch (Exception e) { 
      return 2; 
     } 
    } 
} 

当我打电话method()我得到java.lang.NoSuchMethodError: C$1.<init>(LnewName;)错误。

+0

我不知道JavaAssist,但它听起来好像不是创建匿名内部类。无论如何,你为什么需要这样做?这听起来像是一个有缺陷的对象继承设计的症状。 –

+0

是的,我正在做一些非常愚蠢的事情,我接受我可能需要以不同的方式做,但我想问我可能会问 –

回答

2

虽然我非常希望有人告诉我不同​​,我认为这可能是不可能用Javassist,我发现在了Javassist教程第4.7以下行:

“内部类或匿名类不支持“。

所以我想我应该看看其他运行时类生成库

+0

内部类是支持的,但只有静态的 –

2

Javassist没有支持非静态内部类。
请参阅javadoc的方法CtClass.makeNestedClass(String nestedClassName,boolean isStatic)
除非您移动到顶层您的匿名内部类,否则您的问题无法解决。

+0

我试过makenestedclass API它添加了CtClass对象中的类但是当我将CtClass对象转换为类对象时,内部类不在那里。据我所知,在内部类 的字节码转换会出现问题,请参阅https://github.com/jboss-javassist/javassist/issues/6 – Sudarshan