web-dev-qa-db-ja.com

リフレクションを使用して静的メソッドを呼び出す

静的なmainメソッドを呼び出したい。タイプClassのオブジェクトを取得しましたが、そのクラスのインスタンスを作成できず、staticメソッドmainを呼び出すこともできません。

178
Steven
// String.class here is the parameter type, that might not be the case with you
Method method = clazz.getMethod("methodName", String.class);
Object o = method.invoke(null, "whatever");

メソッドがプライベートの場合、getDeclaredMethod()の代わりにgetMethod()を使用します。そして、メソッドオブジェクトでsetAccessible(true)を呼び出します。

263
Adeel Ansari

Method.invoke()のJavadocから:

基になるメソッドが静的な場合、指定されたobj引数は無視されます。 nullの場合があります。

あなたはどうなりますか

クラスklass = ...; 
 Method m = klass.getDeclaredMethod(methodName、paramtypes); 
 m.invoke(null、args)
43
atk
String methodName= "...";
String[] args = {};

Method[] methods = clazz.getMethods();
for (Method m : methods) {
    if (methodName.equals(m.getName())) {
        // for static methods we can use null as instance of class
        m.invoke(null, new Object[] {args});
        break;
    }
}
10
Frostman