メソッドの配列を取り込んでおり、それらをチェーンして、作業中のオブジェクトを変更したいと考えています。
たとえば、私はから始めます
"getStuff().get(1).get(3).setMoreStuff().put(stuff,6)"
メソッドと呼ばれる配列に分割し、各メソッド内のパラメーターをクリーンアップして、これを変更しようとします。
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 が期待どおりに変更されていることに気付きました。すべてのゲッターとセッターが正しく呼び出されます。しかし、もちろん、"this" が参照する基になるオブジェクトは変更されていません!
最初の行で作成したコピーのゲッターとセッターを呼び出しているだけだと思います。
今は使えない
this.getClass().getMethod(...).invoke(...)
この呼び出しによって返されたオブジェクトに対して同じ getMethod を呼び出す必要があるためです。
明確にするために:
Object res = this;
これへの「ポインタ」を作成します。だから私が電話するとき
res.getStuff().setStuff(foo)
これも変更されます。
しかし、私が電話すると
res = res.getStuff();
res = res.setStuff();
私のループで行うように、これは参照する基になるオブジェクトを変更しませんか?
編集:リクエストに応じてより多くのコードを含めました。
Edit2:私の問題を明確にするために、別の例を追加しました。
Edit3:コードを追加しようとしましたが、すべてのクラスを含めずに動作するプログラムを追加するのは少し難しいです