带有javassist和抽象泛型类的java.lang.AbstractMethodError

时间:2017-04-13 14:14:30

标签: java generics reflection osgi javassist

我想在生成的类中执行一个扩展抽象泛型类的方法,但它会抛出java.lang.AbstractMethodError。

PS:未生成泛型类

示例:

public abstract class AbstractSpecification<T> implements Specification<T>{
    public abstract boolean isSatisfiedBy(T t); 
    public Specification<T> and(final Specification<T> specification) {
        return new AndSpecification<T>(this, specification);
    }
}

生成的类是

ClassPool pool = new ClassPool(true);
pool.insertClassPath(new ClassClassPath(AbstractSpecification.class));
CtClass abstractClazz = pool.get("com.mycompany.AbstractSpecification");
CtClass myclass = pool.makeClass("ValidAge");
myclass.setSuperclass(abstractClazz);
.
.
.

调用isSatisfiedBy有效但and有效java.lang.AbstractMethodError

1 个答案:

答案 0 :(得分:0)

Javassist没有为您实现桥接方法,这仍然是您的责任。因此,在对AbstractSpecification进行子类化时,需要实现两种方法,实际方法和T的擦除桥梁。

例如,为了实现AbstractSpecification<Foo>,您需要实现方法isSatisfiedBy(Foo)和桥isSatisfiedBy(Object),其中后一种方法仅调用前者,包括转换。

如果这看起来很有效,请查看Byte Buddy,它可以透明地处理桥接方法。