通过反射增加新的方法对类[复制](Adding new method to a class thro

2019-09-02 12:47发布

这个问题已经在这里有一个答案:

  • 可以在Java类在运行时的方法添加到自己? 10个回答

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

        }
    }
}

Answer 1:

不,不是通过反射。

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

可以使用AA 字节码操作库添加方法,以班; 但你为什么要?

你不能无论如何调用的方法,除了通过反射,因为他们显然不会在编译时存在。

也许看看项目龙目岛 -这是一个注释预处理程序,可以在编译时添加方法的类。 只要你的类注释正确它将添加getter和setter方法自动的。



Answer 2:

不可以,你无法通过反射添加方法。 在这种情况下,我会使用脚本语言一样的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


文章来源: Adding new method to a class through reflection [duplicate]