2017-02-04 74 views
0

我對自動生成一些鍋爐板方法感興趣(類似於龍目島項目)。 Byte Buddy友好API似乎很有前途,但我不確定如何去使用它。自動生成現場方法

這是一個簡單的用例。可以說,我有一個類User.java

public class User { 
    private String name; 
} 

我打算用這將有產生getter和setter這個的實現註釋修飾這個類。使用字節夥計,我試過如下:

public class MethodInterceptor { 

    public static void main(String[] args) throws Exception { 

     User user = new ByteBuddy() 
       .subclass(User.class)    
       .defineMethod("getName", String.class, Visibility.PUBLIC) 
       .intercept(FieldAccessor.ofBeanProperty()) 
       .defineMethod("setName", Void.TYPE, Visibility.PUBLIC) 
       .withParameter(String.class) 
       .intercept(FieldAccessor.ofBeanProperty())    
       .make() 
       .load(User.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) 
       .getLoaded().newInstance(); 

     user.getClass().getDeclaredMethod("setName").invoke("Jaypal"); 
     Method m = user.getClass().getDeclaredMethod("getName"); 

     System.out.println((String) m.invoke(null)); 
    } 
} 

但是,我得到一個異常

Exception in thread "main" java.lang.NoSuchMethodException: scratchpad.User$ByteBuddy$n0KYCYB5.setName() 
    at java.lang.Class.getDeclaredMethod(Class.java:2130) 
    at scratchpad.MethodInterceptor.main(MethodInterceptor.java:22) 

注:我知道,龍目島項目不支持這一點,但是這只是一個實驗。我對另一個項目的註釋驅動代碼生成更感興趣。這只是一個簡單的例子,我試圖看看Byte Buddy是否適合這種用例。

任何幫助或指導將不勝感激!

回答

1

通過藉助

builder.defineMethod("setName", Void.TYPE, Visibility.PUBLIC) 
     .withParameter(String.class) 

聲明一個方法,你通過

Method method = clazz.getDeclaredMethod("setName", String.class); 

你忘了添加參數類型聲明方法

public void setName(String s); 

此方法可用。

+0

哦,廢話。對於那個很抱歉。但是我必須說一下你在ByteBuddy寫的美麗的圖書館。非常感謝! –

+0

我們如何繞過我在運行時生成的方法的編譯時檢查?我想要做的是註釋字段,它將在運行時基於註釋創建方法。不過,我希望我的測試能夠使用這些方法,但編譯器會因爲尚未定義的方式而受阻礙。抱歉發佈其他問題作爲評論。 –