8

Javaでリフレクションを介してクラスにメソッドを追加することは可能ですか??

public class BaseDomain {

    public BaseDomain(){
        Field[] fields = this.getClass().getDeclaredFields();
        for(int i=0; i<fields.length; i++){
            String field = fields[i].toString();

            String setterMethod = "public void set" + field.toLowerCase();

            //Now I want to add this method to this class.

        }
    }
}
4

2 に答える 2

12

いいえ、反省を通してではありません。

Reflection はクラスとそのメンバーについて尋ねます。フィールドを変更することはできますが、新しいフィールドを作成することはできません。新しいメソッドを追加することはできません。

バイトコード操作ライブラリを使用して、メソッドをクラスに追加できます。しかし、なぜあなたはしたいのですか?

コンパイル時には明らかに存在しないため、リフレクションを介する場合を除いて、とにかくメソッドを呼び出すことはできません。

プロジェクト Lombokを見てみましょう。これは、コンパイル時にクラスにメソッドを追加できるアノテーション プリプロセッサです。クラスに正しく注釈が付けられている限り、ゲッターとセッターが自動的に追加されます。

于 2013-05-10T15:15:45.580 に答える
0

いいえ。リフレクションを通じてメソッドを追加することはできません。この場合、Beanshell 2のようなスクリプト言語を使用します。ここに DynamicObject クラスがあります

public class DynamicObject
{

    bsh.Interpreter interpreter = null;

    public DynamicObject()
    {
        interpreter = new bsh.Interpreter();
    }

    public void addToSource(String... method)
    {
        try
        {
            String main = "";
            for (int i=0; i<lines.length; i++){
                main += lines[i] + "\n";
            }
            interpreter.eval(main);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public Object invoke(String methodname, Object... args)
    {
        try
        {
            return interpreter.getNameSpace().invokeMethod(methodname, args, bsh);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    public Object invoke(String methodname)
    {
        return invoke(methodname, (Object[])null);
    }

}

動的オブジェクトの例は次のようになります

DynamicObject testObj = new DynamicObject();

testObj.addToSource(

    "public int add ( int a, int b )",
    "{",
        "return a+b;",
    "}"

);

int added = testObj.invoke( "add", 5, 4 );   // is 9
于 2013-05-10T15:37:52.197 に答える