我正在使用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而不是A的类,对我来说这似乎是一件事这很好,因为B扩展A.目前我这样做如下:
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();
当我调用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 :(得分:2)
虽然我希望有人以不同的方式告诉我,但我认为Javassist可能无法实现这一点,我在Javassist教程的4.7节中找到了以下内容:
“不支持内部类或匿名类。”
所以我想我应该研究其他运行时类生成库
答案 1 :(得分:2)
Javassist不支持非静态内部类
请参阅方法CtClass.makeNestedClass(String nestedClassName,boolean isStatic)
的javadoc
除非你移到顶层你的anon内部类,否则你的问题无法解决。