2017-04-13 1 views
0

제네릭 클래스를 확장하는 생성 된 클래스 내에서 메서드를 실행하려고하지만 java.lang.AbstractMethodError를 throw합니다.javassist 및 추상 제네릭 클래스를 사용하는 java.lang.AbstractMethodError

PS는 : 일반 클래스는 생성되지 않습니다

예 : 생성 된 클래스는 isSatisfiedBy 작동하지만 and 호출

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); 
. 
. 
. 

java.lang.AbstractMethodError

+0

OSGi 런타임의 번들에서이 작업을 수행한다고 가정합니다. 그래서 'osgi'레이블을 추가 한 것입니다. 이것이 사실이라면 환경에 대한 더 자세한 정보와 메소드 생성 및 호출 방법을 제공해야합니다. –

답변

0

와 Javassist하지 않는 발생

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); 
    } 
} 

입니다

구현하다 당신을위한 교량 방법, 이것은 당신의 책임으로 남아 있습니다. 따라서 AbstractSpecification 서브 클래 싱 할 때 두 가지 메소드를 구현해야하며, 실제 메소드와 지우기 브릿지는 T입니다.

예를 들어 AbstractSpecification<Foo>을 구현하려면 isSatisfiedBy(Foo) 메서드와 isSatisfiedBy(Object) 브릿지를 구현해야합니다. 여기서 후자 메서드는 캐스팅을 포함한 전자 메서드 만 호출합니다.

이 작업이 많은 것으로 보이는 경우 브리지 방법을 투명하게 처리하는 Byte Buddy을 살펴보십시오.

관련 문제