Java反射嵌套方法不修改底层对象

时间:2013-10-01 05:34:54

标签: java pointers reflection

我正在接受一系列方法,我想将它们链接在一起以修改我正在使用的对象。

例如我从

开始
"getStuff().get(1).get(3).setMoreStuff().put(stuff,6)"

我将它拆分为一个名为methods的数组,并清理每个方法中的参数,然后尝试修改它。

Object res = this;
String[] methods = targetString.split("\\.(?=\\D)");
for (String m : methods){

    List<Object> params = new ArrayList<Object>();
    List<Object> params = new ArrayList<Object>();

                    for (String p : m.split("\\(|,|\\)")) {
                        try {
                            if (p.indexOf(".") != -1){
                                double tempD = Double.parseDouble(p);
                                params.add(tempD);
                            } else {
                                int tempP = Integer.parseInt(p);
                                params.add(tempP);
                            }
                        } catch (Exception ex) { //not a number
                            params.add(p);
                        }
                    }
    switch (params.size()) {
        case 1:
            res = res.getClass().getMethod(
                            params.get(0)
                                   ).invoke(res);
            break;
        case 2:
            res = res.getClass().getMethod(
                            params.get(0),
                            params.get(1).getClass()
                                   ).invoke(res, params.get(1));
            break;
        case 3:
            res = res.getClass().getMethod(
                            params.get(0), 
                            params.get(1).getClass(),           
                            params.get(2).getClass()
                                   ).invoke(res, params.get(1), params.get(2));
                                break; 
    }

最后我注意到res已经按照我期望的方式进行了修改。所有的getter和setter都被正确调用。但当然,“这个”所指的基础对象并未改变!

我想我只是在调用我在第一行创建的副本的getter和setter!

现在我不能只使用

this.getClass().getMethod(...).invoke(...) 

因为我需要对此调用返回的对象调用相同的getMethod。

澄清:

Object res = this;

创建一个“指针”。所以当我打电话时

res.getStuff().setStuff(foo)

这也将被修改。

但似乎在我打电话时

res = res.getStuff();
res = res.setStuff();
就像我在循环中一样, 这不会修改这引用的基础对象吗?

编辑:根据请求包含更多代码。

Edit2:添加了其他示例,以澄清我的问题。

Edit3:尝试添加更多代码,有点难以添加一个工作程序而不包括每个类

2 个答案:

答案 0 :(得分:2)

你的一般方法应该没问题(虽然你的参数转换方法有点难看) - 这可能是你的问题。这是一个简短但完整的程序,演示调用方法,然后看到差异:

import java.lang.reflect.*;

class Person {
    private String name = "default";

    public String getName() {
        return name;
    }

    // Obviously this would normally take a parameter
    public void setName() {
        name = "name has been set";
    }
}

class Test {

    private Person person = new Person();

    public Person getPerson() {
        return person;
    }

    // Note that we're only declaring throws Exception for convenience
    // here - diagnostic code only, *not* production code!
    public void callMethods(String... methodNames) throws Exception {
        Object res = this;
        for (String methodName : methodNames) {
            Method method = res.getClass().getMethod(methodName);
            res = method.invoke(res);
        }
    }

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        test.callMethods("getPerson", "setName");
        System.out.println(test.getPerson().getName());
    }
}

正如我所料,输出是“已设置名称”。因此,看看你是否可以逐位简化代码,删除额外的依赖关系等,直到你得到类似简短但完整的东西,但哪些不起作用。我怀疑你实际上会找到问题。

答案 1 :(得分:0)

对象不会更改引用,其VALUE会更改。因此,如果您将调用this.get(“some key”),您将获得与使用反射放置的值相同的值。

右?