我正在接受一系列方法,我想将它们链接在一起以修改我正在使用的对象。
例如我从
开始"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:尝试添加更多代码,有点难以添加一个工作程序而不包括每个类
答案 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”),您将获得与使用反射放置的值相同的值。
右?