2017-03-04 178 views
1

請問homebody能給我一個提示如何用byte-buddy 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"); 

我得到了以下異常:

異常線程 「main」 java.lang.IllegalStateException:不能注入已經加載類型:類delegation.Source

謝謝

回答

0

類只能由每個類加載器加載一次。爲了替換方法,您需要使用Java代理來掛接JVM的HotSwap功能。

字節好友提供了使用這種試劑,使用一個類加載策略:

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

但這不過需要你安裝一個Java代理。在JDK上,可以通過編程方式執行ByteBuddyAgent.install()(包含在字節夥伴代理工件中)。在JVM上,您必須在命令行上指定代理。

+0

Rafael,如果我想重新定義Target類的重新定義的方法中Source類的hello()靜態方法,我仍然可以調用Source類的原始靜態方法嗎?非常感謝 ! –

+0

查看'Advice'類,您可以在原始方法之前和之後添加代碼,並且還可以有條件地跳過該方法。除此之外,您只能重新綁定類以保留原始實現。 –

+0

您是否知道有關如何使用Advice類的任何示例?謝謝 ! –