通过反射向类中添加新方法



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

不,不是通过反射。

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

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

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

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

No。你不能通过反射来添加方法。在本例中,我将使用像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

相关内容

  • 没有找到相关文章

最新更新