"java.lang.Class.getMethod()" 方法中 "parameterTypes" 的解释和正确格式

Explanation and proper format of "parameterTypes" in "java.lang.Class.getMethod()" method

我有以下代码-

MyInterface.java -

    default int getNumber() {
        System.out.print("Number: ");
        return in.nextInt();
    }

    default void displayNumber(int num) {
        System.out.println("Number: " + num);
    }

Main.java -

        int num;

        MyInterface obj = new MyInterface() {
        };

        num = (int) obj.getClass().getMethod("getNumber").invoke(obj);
        obj.getClass().getMethod("displayNumber", parameterType).invoke(obj);

为了清楚起见,我省略了 exceptions

这里我创建了 interface - MyInterface 和两个 methods -

一个 method 读取一个数字并 returns 它。

另一个method取一个数作为parameter打印出来

Main method 中,我创建了一个 inner class 来实现 interface

现在使用 reflectiongetMethod() 我可以成功呼叫第一个 method 来读取号码。

但我不知道使用 getMethod() 传递 argument 的正确格式,因此我无法成功调用第二个 method.

这里,parameterType应该用什么代替?

在 Java 反射中,我们用 Class 个对象表示类型。对于任何原语,这可以通过来自任何原语包装器 class 的 .TYPE 值获得。在您的实例中,它看起来像 Integer.TYPE(这将是 parameterType 的值)。

另请注意,当您实际调用 displayNumber 时,您需要为您的参数提供一些实际值。例如,要表示方法调用 displayNumber(5),您必须将最后一行设为以下内容:

obj.getClass().getMethod("displayNumber", Integer.TYPE).invoke(obj, new Integer(5));

如您所见,我小心翼翼地没有假设基元 5 被自动装箱,因为我们倾向于在 Java 反射中经常使用 Object 作为静态类型。

虽然 ajc2000 的回答是正确的,但我想指出 .class 语法也可以工作:

Retrieving Class Objects

If the type is available but there is no instance then it is possible to obtain a Class by appending ".class" to the name of the type. This is also the easiest way to obtain the Class for a primitive type.

也就是说,以下内容也有效:

obj.getClass().getMethod("displayNumber", int.class).invoke(obj, 5);