【问题标题】:Adding new method to a class through reflection [duplicate]通过反射向类添加新方法[重复]
【发布时间】:2013-05-05 07:49:42
【问题描述】:

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.

        }
    }
}

【问题讨论】:

  • 您要解决的实际问题是什么。可能有更简单的方法来实现它。
  • 这就是我想要的.....stackoverflow.com/questions/16482686/…
  • @Tapas 这并没有添加新方法。它只允许您通过反射设置一个字段。
  • @TapasJena - 你想自动生成 getter 和 setter 吗?您的 IDE 可以做到这一点,所花费的精力远少于实现外部解决方案所需的工作量。

标签: java reflection


【解决方案1】:

不,不是通过反射。

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

您可以使用bytecode manipulation library 向类添加方法;但是你为什么想要呢?

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

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

【讨论】:

  • 要补充鲍里斯的答案,请记住您使用的是静态类型语言。如果你想要更动态的东西,那么看看 ruby​​ 或 python
  • @Boris .....请查看我以前的帖子。 stackoverflow.com/questions/16482686/…
  • @TapasJena 那个问题是关于编译时泛型这个问题是关于运行时反射的——它们并不真正相关。
  • 我想要一个编译时解决方案,以便开发人员可以正常使用它并提供完整的 IDE 支持....有什么想法吗??顺便说一句……那个帖子是我的。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多