【问题标题】:Javassist: Create class that implements generic interfaceJavassist:创建实现通用接口的类
【发布时间】:2015-12-25 02:52:02
【问题描述】:

我正在尝试使用 javassit 创建一个类,该类实现了一个传递泛型参数但没有成功的泛型接口。

我知道答案 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);
}

我的绒球

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

还有错误:

线程“主”java.lang.AbstractMethodError 中的异常: Teste.doit(Ljava/lang/Object;)V 在 com.package.Main3.main(Main3.java:40)

提前致谢!

【问题讨论】:

    标签: java bytecode javassist bytecode-manipulation


    【解决方案1】:

    Java 运行时使用类型擦除。因此,doit(T)方法在接口类型中定义为doit(java.lang.Object)。为了覆盖一个方法,你需要在生成的类中实现它。当您定义一个方法时,Java 编译器会透明地为您执行此操作,而 javassist 不会为您执行此操作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2012-07-24
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多