我正在使用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;)
错误。
我不知道JavaAssist,但它听起来好像不是创建匿名内部类。无论如何,你为什么需要这样做?这听起来像是一个有缺陷的对象继承设计的症状。 –
是的,我正在做一些非常愚蠢的事情,我接受我可能需要以不同的方式做,但我想问我可能会问 –