私は次のHashMapを持っています。その目的は、JPanelを拡張するクラスの特定のメソッドを呼び出すために使用されることです。メソッドは、HashMapの値であり、渡されたパラメータはキーです。Javaリフレクションは匿名クラスの元のインターフェイスを取得
HashMap<Object, String> methodMapper = new HashMap<>();
projectMethodMapper.put("Some title", "setInfoTitle");
projectMethodMapper.put(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("working");
}
}, "attachListener");
この特定のHashMapは、InfoPanelというクラスに使用され、以下のメソッドがあります。
public void attachListener(ActionListener al) {
this.button.addActionListener(al);
}
public void setInfoTitle(String name) {
((TitledBorder) this.getBorder()).setTitle(name);
}
その後、私はHashMapのキーを反復します。
InfoPanel infoPanel = new InfoPanel();
for (Object key : keys) {
Method method = InfoPanel.class.getDeclaredMethod(methodMapper.get(key), key.getClass());
method.invoke(infoPanel, key));
}
あなたが想像できるように、キーはStringオブジェクトであるとき.getClassがMainPanel $ 1を返して、それは匿名だからgetDeclaredMethodがタイプMainPanel $ 1のパラメータを持つメソッドattachListenerを検索するとき、問題が来る問題はありませんクラスはオンザフライで作成されました。私の質問は - どのようなインターフェイスは、オブジェクトのインスタンス化に使用される匿名クラスの作成に使用されて見つけるのですか?
反射の使用は交渉可能ではありません。この例は、問題の内容を示すために非常に単純化されています。 InfoPanelは厳密にはInfoPanelではなく、多くのクラスの1つで、HashMapの反復処理の瞬間には、実際にどのクラスが使用されているのかを制御することはできないため、List>を作成することはできません。反射を伴って起こらなければならない、代替は不可能である。しかし、私はそれが将来他の誰かに役立つことを願っています。 :) –
@HristoValchevHristovしかし、オブジェクトが厳密に 'InfoPanel'でない場合、how/whyメソッドの' attachListener'と 'setInfoTitle'メソッドを呼び出していますか?これらの呼び出しは、オブジェクトに実際にそれらのメソッドがある場合にのみ機能します。それらがスーパータイプの 'InfoPanel'に属していれば、代わりにそのスーパータイプのコンシューマを使うことができます。私はまだあなたがリフレクションを使用する理由を理解していません。 –
短いストーリー:存在しなければ私は彼らに電話していません。複雑な答えがあり、実際には問題とは関係ありません。問題は、ActionListenerオブジェクトを受け取るメソッドが見つからないことです。 –