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

不,不是通过反思。

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

您可以使用字节码操作库向类添加方法;但你为什么要?

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

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

于 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 回答