2017-02-17 9 views
0

Can I redefine private methods using Byte Buddy?이라는 아이디어를 바탕으로 부모 클래스에서 개인 메서드를 재정의하고 싶습니다. 그게 가능합니까? 아니면 닭고기와 달걀 같은 문제입니까?Byte Buddy를 사용하여 상위 클래스에서 개인 메서드를 재정의 할 수 있습니까?

감사합니다.

+0

당신이 무엇을 요구하고 있는지 명확하지 않습니다. 'private' 메쏘드는 그것을 선언하는 클래스에만 관련이 있습니다. 이것은 다시 정의해야하는 클래스입니다. 이 클래스가 다른 클래스의 수퍼 클래스인지 여부는 관계가 없습니다. – Holger

+0

A의 private 메소드는 차례대로 다른 패키지 보호 및 개인 메소드를 호출하기 때문에 바꿔 쓰거나 복사하고 싶지 않습니다. B (서브 클래스)에서 A의 private 메소드를 다시 정의해야합니다. –

+0

'B'에는 그러한 메소드가 없습니다. 'A'의'private' 메소드는'A'에만 존재합니다. 당신의 작업을 해결할 수있는 유일한 방법은'A'의'private' 메소드를'this instanceof B' 체크를하는 메소드로 대체하고 체크가'false'로 평가되면 이전 코드로 위임하는 것입니다. ByteBuddy가 이런 종류의 계측을 지원하는지 여부는 모르지만 어쨌든 의심스러운 디자인처럼 보입니다. – Holger

답변

0

개인 메서드는 가상으로 전달되지 않으므로 하위 클래스 내에서 전용 메서드의 디스패치를 ​​변경할 수 없습니다. 이 작업을 수행하는 유일한 방법은 개인 메서드에 대한 조건부 디스패치를 ​​직접 하드 코딩하는 것입니다.

Byte Buddy의 Advice 클래스와 Java 에이전트를 조합하여 사용할 수 있습니다. 자바 에이전트는 다음과 같습니다 MyAdvice의 코드가 privateMethod라는 방법의 befinning에 인라인

new AgentBuilder.Default() 
    .disableClassFormatChanges() 
    .with(RedefinitionStrategy.REDEFINITION) 
    .type(is(ClassWithPrivateMethod.class)) 
    .transform((builder, type, cl, module) -> { 
    return builder.visitor(Advice.to(MyAdvice.class) 
            .on(named("privateMethod"))); 
    }).install(inst); 

. 조건부 파견은 다음과 같습니다 false가 반환되는 경우는 true를 반환함으로써 및 건너 뛰기 coniditon를 사용하여

class Adv { 
    @OnMethodEnter(skipOn = OnNonDefaultValue.class) 
    static boolean intercept(@This ClassWithPrivateMethod self) { 
    if (self instanceof ParentClass) { 
     // Your code 
     return true; 
    } else { 
     return false; 
    } 
    } 
} 

만 실제 코드를 실행합니다.