問題
ある友人が興味深い問題を提案しました。次のコードがあるとします。
public class OuterClass {
private String message = "Hello World";
private class InnerClass {
private String getMessage() {
return message;
}
}
}
外部クラスから、message
変数の内容を出力するにはどうすればよいですか? もちろん、メソッドやフィールドのアクセシビリティを変更することは許可されていません。
(ソースはこちら、フランスのブログです)
解決
この問題を解決するコードは次のとおりです。
try {
Method m = OuterClass.class.getDeclaredMethod("access$000", OuterClass.class);
OuterClass outerClass = new OuterClass();
System.out.println(m.invoke(outerClass, outerClass));
} catch (Exception e) {
e.printStackTrace();
}
メソッド名は実際には標準的ではないことに注意してくださいaccess$000
(この形式が強く推奨される形式であっても)、一部の JVM はこのメソッドに名前を付けますaccess$0
。したがって、より良い解決策は、合成メソッドを確認することです。
Method method = null;
int i = 0;
while ((method == null) && (i < OuterClass.class.getDeclaredMethods().length)) {
if (OuterClass.class.getDeclaredMethods()[i].isSynthetic()) {
method = OuterClass.class.getDeclaredMethods()[i];
}
i++;
}
if (method != null) {
try {
System.out.println(method.invoke(null, new OuterClass()));
} catch (Exception e) {
e.printStackTrace();
}
}
したがって、この問題の興味深い点は、合成法の使用を強調することです。これらのメソッドを使用すると、ソリューションで行ったようにプライベート フィールドにアクセスできます。もちろん、リフレクションを使う必要がありますし、こういう使い方はかなり危険だと思いますが…
質問
開発者としての私にとって、合成メソッドの関心は何ですか? 合成繊維の使用が役立つ場合、どのような状況が考えられますか?