【发布时间】:2014-05-12 05:02:26
【问题描述】:
我正在尝试使用 javassist 以编程方式创建和编译一个实现接口的类(在运行时)。
每当我调用该动态类的实例时,都会收到以下错误:
java.lang.AbstractMethodError: FooImpl.test()Ljava/lang/Object;
这是我的界面
public class FooBarInterface<T> {
public T getEntity();
}
这是一个示例实体
public class FooEntity {
@Override
public String toString() {
return "Hello, Foo!";
}
}
这是我以编程方式实现接口的方式
public void test() {
ClassPool classPool = ClassPool.getDefault();
CtClass testInterface = classPool.get(FooBarInterface.class.getName());
CtClass fooImpl = classPool.makeClass("FooImpl");
fooImpl.addInterface(testInterface);
CtMethod testMethod = CtNewMethod.make(
"public com.test.FooEntity getEntity(){" +
"return new com.test.FooEntity();" +
"}",
canImpl
);
fooImpl.addMethod(testMethod);
fooImpl.writeFile();
TestInterface<FooEntity> test =
(TestInterface<FooEntity>) fooImpl.toClass().newInstance();
System.out.println(test.getEntity());
}
如果我将实现的方法的返回类型更改为 Object,那么我不会收到错误,如下所示:
CtMethod testMethod = CtNewMethod.make(
"public Object getEntity(){" +
"return new com.test.FooEntity();" +
"}",
canImpl
);
然后我成功获得hello, Foo!。我可以将返回类型更改为 Object,但我想了解更多为什么以 Foo 类型返回会产生 AbstractMethodError。
【问题讨论】:
-
ClassPool classPool = ClassPool.getDefault();这些类不在标准 java 库中。这是第三方库? -
是的,你是对的!我正在使用的第三方库是 javassist(虽然在我的问题中提到)
标签: java generics javassist java-bridge-method