2016-12-02 4 views
1

Byte Buddy를 사용하여 일부 메소드의 가시성을 변경할 수 있습니까? 개인 정적 메서드가있는 사용자 클래스가 있고 이러한 메서드는 일부 호출을 위임 할 필요가 있지만 개인 있기 때문에 현재 실패합니다. 그래서 public modifier를 추가하여 앞에서 설명한 메소드를 변환하여 사용자 클래스를 다시 정의 할 수 있을지 궁금합니다. 하지 효과로 대상 Java 메소드에 setAccessible(true) 메소드를 호출 기록을 위해 메소드의 가시성 변경

, 바이트 버디는 여전히 다음과 같은 예외와 함께 실패로 : 나는 트릭을 할 수있는 몇 가지 API를 발견했습니다

java.lang.IllegalStateException: class net.bytebuddy.renamed.java.lang.Object$ByteBuddy$VHdvjIkb cannot see private java.lang.String org.mockaccino.MockaccinoTest.lambda$3() throws java.lang.Exception 
at net.bytebuddy.implementation.MethodCall$MethodInvoker$ForContextualInvocation.invoke(MethodCall.java:2387) 
... 

하지만, 내 경우에는 필요하지 않은 방법을 도구로 사용할 필요가 있습니다.

예 :

byteBuddy.redefine(targetClass) 
    .method(ElementMatchers.named(targetMethod.getName())) 
    .intercept(???) 
    .transform(Transformer.ForMethod.withModifiers(Visibility.PUBLIC)) 
    .make() 
    .load(getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); 

내 질문은 : 재정의 소스 방식의 몸을 호출 할 수있는 인터셉터가?

또는 대상 메서드를 공개적으로 볼 수있는 다른 방법이 있습니까?

답변

2

메소드의 수정자를 다시 정의하면로드 된 클래스에서 작동하지 않습니다. JVM은 메소드를 추가/제거하거나 메소드의 특성을 변경하는 재 정의를 거부합니다. 그 수식어.

메서드를 공개하려면 SuperMethodCall.INSTANCE으로 메서드를 추가하는 재정의 대신 rebasement를 적용해야합니다. 이 변환은 문제의 클래스를 처음로드하기 전에 적용해야합니다.