Javassist生成的类中的匿名内部类问题

时间:2014-01-31 07:16:37

标签: 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() {
        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;)错误。

2 个答案:

答案 0 :(得分:2)

虽然我希望有人以不同的方式告诉我,但我认为Javassist可能无法实现这一点,我在Javassist教程的4.7节中找到了以下内容:

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

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

答案 1 :(得分:2)

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