Javassist生成的类中的匿名内部类问题
我正在使用Javassist在运行时生成一些类,当我在这些类中创建匿名内部类时,它们会在尝试实例化封闭对象时崩溃(据我所知) 我已经尝试实现我正在尝试做的事情的最简单版本 我定义了3类,如下所示:Javassist生成的类中的匿名内部类问题,java,javassist,Java,Javassist,我正在使用Javassist在运行时生成一些类,当我在这些类中创建匿名内部类时,它们会在尝试实例化封闭对象时崩溃(据我所知) 我已经尝试实现我正在尝试做的事情的最简单版本 我定义了3类,如下所示: public class A { public int method() { return 1; } } public class B extends A { } public class C extends A { public int method(
public class A {
public int method() {
return 1;
}
}
public class B extends A {
}
public class C extends A {
public int method() {
return 5;
}
}
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();
我现在想做的是使用javassist(或者我猜是其他什么)来(在运行时)生成一个类,该类具有C的所有功能,但它扩展了B而不是a,对我来说这似乎是一件很好的事情,因为B扩展了a。目前我正在这样做:
public class A {
public int method() {
return 1;
}
}
public class B extends A {
}
public class C extends A {
public int method() {
return 5;
}
}
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的method()中实例化一个匿名内部类,如下所示:
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;
}
}
}
public类扩展了{
公共int方法(){
试一试{
返回新的可调用(){
@凌驾
公共整数调用()引发异常{
返回5;
}
}.call();
}捕获(例外e){
返回2;
}
}
}
当我调用
method()
时,我得到java.lang.NoSuchMethodError:C$1.(LnewName;)
错误。虽然我希望有人能告诉我不同的情况,但我认为这在Javassist中可能不可能实现,我在Javassist教程的第4.7节中找到了以下几行内容:
“不支持内部类或匿名类。”
因此,我想我应该研究其他运行时类生成库虽然我希望有人能告诉我不同的情况,但我认为这在Javassist中是不可能的,我在Javassist教程的第4.7节中找到了以下内容: “不支持内部类或匿名类。”
所以我想我应该研究一下其他运行时类生成库Javassist不支持非静态内部类。
方法见javadoc。
除非移动到anon内部类的顶层,否则无法解决问题。Javassist不支持非静态内部类。
方法见javadoc。
除非您移动到anon内部类的顶层,否则您的问题将无法解决。我不知道JavaAssist,但听起来它并没有创建匿名内部类。你为什么要这么做?这听起来像是有缺陷的对象继承设计的症状。是的,我正在做一些非常愚蠢的事情,我承认我可能不得不以不同的方式来做,但我想我可能askI不知道JavaAssist,但听起来好像它没有创建匿名内部类。你为什么要这么做?这听起来像是有缺陷的对象继承设计的症状。是的,我做了一件非常愚蠢的事情,我承认我可能不得不以不同的方式来做,但我想我可能会支持askInner类,但只支持静态类。有人知道是否有替代方法来处理非静态内部类吗?支持内部类,但是只有静态类,有人知道是否有其他方法可以使用非静态内部类吗?我尝试了makenestedclass API,它在CtClass对象中添加了类,但当我将CtClass对象转换为Class对象时,内部类不存在。据我所知,innerclass的字节码转换会有问题。我尝试了makenestedclass API,它在CtClass对象中添加了类,但当我将CtClass对象转换为Class对象时,内部类不存在。据我所知,innerclass的字节码转换将出现问题,请参见