通过反射向类添加新方法

时间:2013-05-10 15:12:44

标签: java reflection

是否可以通过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.

        }
    }
}

2 个答案:

答案 0 :(得分:11)

不,不是通过反思。

反思询问类及其成员,您可以更改字段但不能创建新字段。您无法添加新方法。

您可以使用a bytecode manipulation library向类添加方法;但你为什么要这样做?

除了通过反射之外,你无法调用这些方法,因为它们在编译时显然不存在。

也许看看project Lombok - 这是一个注释预处理器,可以在编译时向类添加方法。只要您的类被正确注释,它就会自动添加getter和setter。

答案 1 :(得分: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