次の例を見てください。getMethod()
を最初に呼び出すと、Eclipseで警告が生成されます。 2つ目は機能せず、NoSuchMethodException
で失敗します。
タイプ
null
の引数は、タイプ_Class<?>[]
_からvarargsメソッドgetMethod(String, Class<?>...)
を呼び出すために、明示的に_Class<Example>
_にキャストする必要があります。あるいは、varargs呼び出しのためにClassにキャストすることもできます。
私は警告に従いましたが、何も機能しなくなりました。
_import Java.lang.reflect.Method;
public class Example
{
public void exampleMethod() { }
public static void main(String[] args) throws Throwable
{
Method defaultNull = Example.class.getMethod("exampleMethod", null);
Method castedNull = Example.class.getMethod("exampleMethod", (Class<?>) null);
}
}
_
2番目の呼び出しでは、次のエラーが発生します。
_Exception in thread "main" Java.lang.NoSuchMethodException:
Example.exampleMethod(null)
at Java.lang.Class.getMethod(Class.Java:1605)
at Example.main(Example.Java:12)
_
誰かが私にこの行動を説明できますか?警告を回避する正しい方法は何ですか?
getMethod
メソッドの2番目のパラメーターは、VarArg引数です。正しい使用法は次のとおりです。反映されたメソッドにパラメーターがない場合、2番目のパラメーターを指定しないでください。リフレクトされたメソッドにパラメーターがある場合、各パラメーターは次の方法で指定する必要があります。
_import Java.lang.reflect.Method;
public class Example {
public void exampleMethodNoParam() {
System.out.println("No params");
}
public void exampleMethodWithParam(String arg) {
System.out.println(arg);
}
public static void main(String[] args) throws Throwable {
Example example = new Example();
Method noParam = Example.class.getMethod("exampleMethodNoParam");
Method stringParam = Example.class.getMethod("exampleMethodWithParam", String.class);
noParam.invoke(example);
stringParam.invoke(example, "test");
//output
//No params
//test
}
}
_
[〜#〜]更新[〜#〜]
したがって、あなたの場合、null
を指定すると、コンパイラは指定したタイプを認識しません。 null
を不明なクラスにキャストしようとすると、とにかくクラスであるため、例外が発生します。
public void exampleMethod(Class<?> object) { }
exampleMethodの署名。
Java APIで定義されているgetMethodは次のとおりです。
Method Java.lang.Class.getMethod(String name, Class<?>... parameterTypes)
呼び出したメソッドに引数がない場合は、空の配列または2番目の引数に長さが0の配列を指定する必要があります。次のようになります。
Method defaultNull = Example.class.getMethod("exampleMethod", new Class<?>[0]);
メソッドを呼び出し、空の配列も設定する必要があります。
defaultNull.invoke(example , new Object[0]);
null
をClass<?>[]
にキャストしなかったので、Class<?>
にキャストしました。そのシグニチャに一致するメソッドがないため、例外がスローされます。キャストを修正して、配列を正しく識別します。