web-dev-qa-db-ja.com

null型の引数は、varargsメソッドを呼び出すためにClass <?> []に明示的にキャストする必要があります

次の例を見てください。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)
_

誰かが私にこの行動を説明できますか?警告を回避する正しい方法は何ですか?

16

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の署名。

38
StKiller

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]);
3
Alex.Lee

nullClass<?>[]にキャストしなかったので、Class<?>にキャストしました。そのシグニチャに一致するメソッドがないため、例外がスローされます。キャストを修正して、配列を正しく識別します。

1
Mike Yockey