1

別のクラスからプライベート メソッドにアクセスする必要があります。アクセスするには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 ファイルを編集せずに回避策を見つけようとしています。

4

2 に答える 2

2

1) 私はここで、リフレクションは最後の手段としてのみ使用するように言っている人をたくさん見てきました。

ハックが実際に機能すると仮定すると、リフレクションを使用するよりも、ハックを使用する方が適切です。これは、リフレクションを使用する方がはるかにコストがかかるためです。

リフレクションに関する Java の API の抜粋を次に示します。

  • リフレクションには動的に解決される型が含まれるため、特定の Java 仮想マシンの最適化は実行できません。したがって、リフレクト操作は、リフレクション操作を行わない操作よりもパフォーマンスが低下するため、パフォーマンスが重視されるアプリケーションで頻繁に呼び出されるコードのセクションでは避ける必要があります。

2) リフレクションはセキュリティの問題を引き起こす可能性がありますか? (SecurityManager は時々 setAccessible を拒否できますか?) これは、どのマシン/セットアップでも常に機能する必要があります。

同じく:

  • リフレクションには、セキュリティ マネージャーの下で実行している場合に存在しない可能性があるランタイム アクセス許可が必要です。これは、アプレットなどの制限されたセキュリティ コンテキストで実行する必要があるコードの重要な考慮事項です。

そのため、setAccessible メソッドだけでなく、リフレクションの使用全体が拒否される可能性があります。

もう 1 つの考慮事項は、インスタンス化せずに Hack クラス メソッドを呼び出すには、内部メソッドを静的に設定する必要があることです。

class Hack extends ProtectedInnerClass {
   public static void accessPrivateMethod() {
       super.callPrivateMethod();
   }
}
Hack.accessPrivateMethod();
于 2013-08-28T20:00:39.733 に答える
0

この疑問が生じるのは、おそらく設計が悪いか、Java が「サブパッケージ」の可視性を許可していないことが原因です。ただし、パフォーマンスが懸念される場合は、「小さな」ハックを使用してください。それ以外の場合は、反射を使用した審美的なソリューションを選択してください。しかし、まず最初に、あなたのデザインが優れているかどうかを調べてみてください。

于 2013-08-28T19:17:24.890 に答える