まず第一に、間違ったアプローチである文字列から解決された動的なボタンの動作に関するあなたの考えについての私のコメントを考えてみてください。ただし、要求したとおりのものが必要な場合は、Reflection APIが必要です。
次に例を示します。
Class c = SomeClassWithMethods.class;
Method m = c.getMethod("someMethodName", String.class, Integer.class, Integer.TYPE);
m.invoke(baseObjectFromWhichToCallTheMethod, "stringParam", 10, 5);
追加した:
もう 1 つのオプションは、リフレクションよりも少しきれいですが、それでも厄介な設計ですが、マップを使用してそれらStrings
をメソッドにリンクすることです。コードは少し長くなりますが、Java の観点からは、タスクにリフレクションを使用するよりもはるかに優れています (私が認識していない特定の要件がない限り)。これがどのように機能するかです:
//Interface whose instances will bind strings to methods
interface ButtonClickHandler {
void onClick();
}
class SomeClassYouNeed {
//One of the methods that will be bound to "onButtonOneClick()"
public void onButtonOneClick() {
log.info("ButtonOneClick method is called");
}
public void onButtonTwoClick() {
log.info("ButtonTwoClick method is called");
}
//Map that will hold your links
private static Map<String, ButtonClickHandler> buttonActionMap;
//Static constructor to initialize the map
static {
buttonActionMap = new Map<String, ButtonClickHandler>();
buttonActionMap.put("onButtonOneClick()",new ButtonClickHandler() {
@Override
public void onClick() {
onButtonOneClick();
}
});
buttonActionMap.put("onButtonTwoClick()",new ButtonClickHandler() {
@Override
public void onClick() {
onButtonTwoClick();
}
});
}
public void callByName(String methodName) {
final ButtonClickHandler handler = buttonActionMap.get(methodName);
if (handler == null) {
throw new IllegalArgumentException("No handler found by name: "+methodName);
}
handler.onClick();
}
}
呼び出した後、静的メソッドを使用してボタンのクリックを処理するcallByName("onButtonTwoClick()")
それぞれのインスタンスをフェッチします。ButtonClickHandler
onButtonTwoClick()