1. ホーム
  2. java

[解決済み] プライベートメソッドを呼び出す方法はありますか?

2022-04-24 07:50:40

質問

XML とリフレクションを使って Object を別のクラスへ送る。

通常、これらのオブジェクトは外部オブジェクトのサブフィールドですが、たまにその場で生成したいものがあります。このようなことを試したことがあるが、無駄だった。それは、Javaが以下のようなアクセスを許さないからだと思います。 private メソッドでリフレクションを行うことができます。

Element node = outerNode.item(0);
String methodName = node.getAttribute("method");
String objectName = node.getAttribute("object");

if ("SomeObject".equals(objectName))
    object = someObject;
else
    object = this;

method = object.getClass().getMethod(methodName, (Class[]) null);

提供されたメソッドが private で失敗します。 NoSuchMethodException . メソッドを作成することで解決できました。 public または、別のクラスを作成してそこから派生させる。

長い話になりますが、私はただ単に private メソッドをリフレクションで実行します。

どのように解決するのですか?

リフレクションでプライベートメソッドを呼び出すことができます。投稿されたコードの最後のビットを修正する。

Method method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
Object r = method.invoke(object);

いくつか注意点があります。まず1つ目。 getDeclaredMethod で宣言されたメソッドのみが検索されます。 Class スーパータイプから継承されたものではありません。そのため、必要に応じて、具象クラスの階層をたどってください。次に SecurityManager の使用を防ぐことができます。 setAccessible メソッドを使用します。そのため PrivilegedAction (を使用)。 AccessController または Subject ).