2017-02-04 10 views
0

私はいくつかのボイラープレートメソッドを自動生成することに興味があります(プロジェクトロンボクに似ています)。バイトバディフレンドリーなAPIは有望だと思われますが、私はそれをどうやって使うのか分かりません。フィールド生成メソッドの自動生成

ここでは簡単な使用例です。私はこのためにゲッターとセッターを生成するの実装を持っているでしょうアノテーションでこのクラスを飾るを計画してい

public class User { 
    private String name; 
} 

クラスUser.javaを考えてみましょう。バイトバディを使用して、私は次のことを試してみました:

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がそのような使用例に適しているかどうかを調べるための簡単な例です。

ご迷惑をおかけして申し訳ございません。

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

経由でメソッドを宣言することで

答えて

1

は、あなたは、パラメータの種類を追加するのを忘れ

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

経由

public void setName(String s); 

この方法が利用できるメソッドを宣言しています。

+0

ありがとうございます。申し訳ありません。しかし、私はあなたがByteBuddyで書かれた美しい図書館が何であるかを言わなければなりません。どうもありがとうございます! –

+0

実行時に生成しているメソッドのコンパイル時チェックをバイパスするにはどうすればよいですか?私がしようとしているのは、実行時に注釈に基づいたメソッドを作成するフィールドに注釈を付けることです。しかし、私はそれらのメソッドを使うように私のテストをしたいと思いますが、コンパイラはまだ定義されていないので、途中で取得します。追加の質問をコメントとして投稿することについての申し立て。 –