2016-12-02 87 views
1

是否可以(僅)更改Byte Buddy某些方法的可見性?我有一個私有靜態方法的用戶類,我需要委託一些調用這些方法,但它目前失敗,因爲它們是私人的。所以,我想知道是否可以通過添加一個公共修飾符來轉換上述方法來重新定義用戶類。更改方法的可見性

爲了記錄在案,要求目標Java方法沒有效果setAccessible(true)方法,如字節巴迪仍然失敗,但以下情況除外:

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

我發現了一些API,這些API可能做的伎倆,但我需要測試方法,這在我的情況下是不需要的。

如:

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

我的問題是:是否有一個攔截器,能夠調用正在被重新定義源法的身體的?

或者還有另一種方法使目標方法公開可見嗎?

回答

2

重新定義方法的修飾符不適用於加載的類。 JVM拒絕添加/刪除方法或改變任何方法屬性的任何重新定義,例如它的修飾符。

爲了使方法公開,您需要應用rebasement而不是重新定義,其中按照SuperMethodCall.INSTANCE來測試方法。這個轉換需要在有問題的類的第一次加載之前應用。