別のクラスからプライベート メソッドにアクセスする必要があります。アクセスするには2つの方法があります。1 つ目は、明らかな反射です。2 つ目は一種のハックです。呼び出す必要があるプライベート メソッドは、保護された内部クラスの accessPrivateMethod メソッドから呼び出されています。このメソッドは文字通り、必要なプライベート メソッドのみを呼び出します。それで、リフレクションを使用してアクセスする方が良いですか、それともそれを呼び出す保護された内部クラスを拡張して「ハック」する方が良いですか。コードを参照してください:
method = object.getClass().getDeclaredMethod("privateMethod");
method.setAccessible(true);
Object r = method.invoke(object);
または: (ProtectedInnerClass は、プライベート メソッドにアクセスするクラスの保護された内部クラスです。)
class Hack extends ProtectedInnerClass {
public void accessPrivateMethod() {
// callPrivateMethod literally only calls the private method
// I need to call.
super.callPrivateMethod();
}
}
...
Hack.accessPrivateMethod();
いくつかの追加の考え:
1) 私はここで、リフレクションは最後の手段としてのみ使用するように言っている人をたくさん見てきました。
2) リフレクションはセキュリティの問題を引き起こす可能性がありますか? (SecurityManager は時々 setAccessible を拒否できますか?) これは、どのマシン/セットアップでも常に機能する必要があります。
私のハックが明確でない場合は、そう言ってください。さらに詳しく説明します。ありがとう!
PS:アクセスする必要があるプライベート メソッドは、JUNG ライブラリにあります。それを呼び出すと、バグが修正されます。AKA JUNG jar ファイルを編集せずに回避策を見つけようとしています。