2017-04-13 206 views
0

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

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

+0

我假设你是在OSGi运行时内的一个包中做这个,这就是为什么你添加了'osgi'标签。如果确实如此,则需要提供有关环境的更多详细信息以及生成和调用方法的位置和方式。 –

回答

0

Javassist没有implem你的桥梁方法,这仍然是你的责任。因此,在子类别AbstractSpecification时,需要实施两种方法,T的实际方法和删除桥梁。

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

如果这似乎很多工作,看看Byte Buddy它为您透明地处理桥梁方法。