Javassist:创建实现通用接口(interface)的类

标签 java bytecode javassist bytecode-manipulation

我正在尝试使用 javassit 创建一个类,该类实现传递通用参数的通用接口(interface),但到目前为止尚未成功。

我知道答案 Javassist: creating an interface that extends another interface with genericsjavassit tutorial但这些都没有帮助。

这是我的代码:

String met = "public void doit(com.package.Pojo o) { System.out.println(\"Result: \" + o.getName()); }";

ClassPool cp = ClassPool.getDefault();

CtClass cc = cp.makeClass("Teste");
cc.setInterfaces(new CtClass[]{cp.get("com.package.Factor")});

ClassSignature cs = new ClassSignature(null, null,
  // Set interface and its generic params
  new ClassType[]{new ClassType("com.package.Factor",
    new TypeArgument[]{new TypeArgument(new ClassType("com.package.Pojo"))}
)});

cc.setGenericSignature(cs.encode());

    //cc.setGenericSignature("Ljava/lang/Object;Lcom/aurora/core/util/Factor<Lcom/aurora/core/util/Pojo;>;");

CtMethod make = CtNewMethod.make(met, cc);
cc.addMethod(make);

Class<Factor<Pojo>> class1 = cc.toClass();
Factor<Pojo> obj = (Factor<Pojo>) class1.newInstance();     
obj.doit(new Pojo("name here"));

因子类别:

public interface Factor<T> {
    void doit(T ent);
}

我的pom

<dependency>
  <groupId>org.javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.20.0-GA</version>
</dependency>

错误:

Exception in thread "main" java.lang.AbstractMethodError: Teste.doit(Ljava/lang/Object;)V at com.package.Main3.main(Main3.java:40)

提前致谢!

最佳答案

Java 运行时支持类型删除。因此,doit(T)方法在接口(interface)类型中被定义为doit(java.lang.Object)。为了重写方法,您需要在生成的类中实现它。当您定义方法时,Java 编译器会透明地为您执行此操作,而 javassist 不会为您执行此操作。

因此,需要添加一个所谓的bridge method调用实际方法但覆盖接口(interface)的方法:

public void doit(Object ent) {
  doit((Pojo) ent);
}

关于Javassist:创建实现通用接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32813238/

相关文章:

java - 为每个RecyclerView项目创建DetailsActivity

java - 同步代码块

java - 重命名的类中的重复字段(ASM + Jar)

java - 什么是字节码以及 JVM 如何处理它们

java - 执行后在Java代理中运行代码?帖子主要?

java - 如何从其他项目中存在的类文件获取输入流

java - 里面有 thymeleaf [if mso]

java - 如何在 javaFX 中的字符顶部键入特殊字符)

python - 从 Python AST 生成 .pyc?

java - ClassPool.get() 在明显存在的类上抛出 NotFoundException?