2017-03-04 3 views
1

homebody는 바이트 - 버디 1.6.9를 사용하여 정적 메서드를 재정의하는 방법을 알려줄 수 있습니까?ByteBuddy를 사용하여 정적 메서드 다시 정의

나는 시도했다이 :

나는 예외 다음있어
public class Source { 
    public static String hello(String name) {return null;} 
} 


public class Target { 
    public static String hello(String name) { 
     return "Hello" + name+ "!"; 
    } 
} 
String helloWorld = new ByteBuddy() 
       .redefine(Source.class)    
       .method(named("hello")) 
       .intercept(MethodDelegation.to(Target.class)) 
       .make() 
       .load(getClass().getClassLoader()) 
       .getLoaded() 
       .newInstance() 
       .hello("World"); 

: 스레드에서

예외 "주요"java.lang.IllegalStateException : 클래스 delegation.Source

: 이미로드 유형을 삽입 할 수 없습니다

감사합니다.

답변

0

클래스는 각 클래스 로더별로 한 번만로드 할 수 있습니다. 메소드를 대체하려면 Java 에이전트를 사용하여 JVM의 HotSwap 기능에 연결해야합니다.

.load(Source.class.getClassLoader(), 
     ClassReloadingStrategy.fromInstalledAgent()); 

이 그러나 자바 에이전트를 설치해야 않습니다

바이트 버디는 대리인, 사용을 사용하는 클래스 로딩 전략을 제공합니다. JDK의 경우 프로그래밍 방식으로 ByteBuddyAgent.install() (바이트 - 버디 - 에이전트 아티팩트에 포함)으로 수행 할 수 있습니다. JVM에서는 명령 행에 에이전트를 지정해야합니다.

+0

Rafael, 대상 클래스의 재정의 된 메서드에서 원본 클래스의 hello() 정적 메서드를 리베이스하려는 경우 어떻게 원본 클래스의 원래 정적 메서드를 호출 할 수 있습니까? 정말 고맙습니다 ! –

+0

원본 메소드 앞뒤에 코드를 추가 할 수 있고 조건부로 메소드를 건너 뛸 수있는 'Advice' 클래스를 살펴보십시오. 그 외에는 원래 구현을 유지하기 위해 클래스를 리베이스 할 수만 있습니다. –

+0

Advice 클래스 사용 방법에 대한 예를 알고 계십니까? 감사 ! –