"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
现在使用 reflection
和 getMethod()
我可以成功呼叫第一个 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 语法也可以工作:
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);
我有以下代码-
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
现在使用 reflection
和 getMethod()
我可以成功呼叫第一个 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 语法也可以工作:
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);