一个简单的问题,如何使此代码起作用?
public class T {
public static void main(String[] args) throws Exception {
new T().m();
}
public // as mentioned by Bozho
void foo(String... s) {
System.err.println(s[0]);
}
void m() throws Exception {
String[] a = new String[]{"hello", "kitty"};
System.err.println(a.getClass());
Method m = getClass().getMethod("foo", a.getClass());
m.invoke(this, (Object[]) a);
}
}
输出:
class [Ljava.lang.String;
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
最新回答
- 2021-1-111 #
- 2021-1-112 #
//优先编辑:
您的问题是
getMethod
寻找一个public
成员。来自
Class.getMethod
(强调我的):Returns a
Method
反映指定 public的对象 此Class对象表示的类或接口的成员方法因此,您有两种选择:
Make
public void foo(String... s)
并使用getMethod
使用
getDeclaredMethod
代替请注意,
getField/s
存在相同的区别 vs维兹威兹 和getDeclaredField/s
vs维兹威兹
//
getConstructor/s
问题这特别讨厌,但是发生的是那个
getDeclaredConstructor/s
如果您需要将引用类型的数组作为唯一参数传递,则将变得棘手,因为它可以强制转换为invoke
,即使应该将其包装在invoke(Object obj, Object... args)
中 代替。您可以这样做:
Object[]
这绕过了vararg机制.更简洁地说,您也可以这样做:
new Object[1]
投向
m.invoke(this, new Object[] {a}); // Bohzo's solution
使vararg机制为您创建数组。通过
m.invoke(this, (Object) a);
时也需要技巧 作为varargs的参数,与反射无关。Object
null
相关问题
- reflection:如何拦截具有标准Java功能(无AspectJ等)的方法调用?javareflectionmethods2021-01-12 01:28
- Java 9中集合的重载便利工厂方法的重点是什么javacollectionsvariadicfunctionsjava92021-01-11 22:56
有效.问题是
getMethod(..)
只搜索public
方法.来自javadoc:Update: 成功获取方法后,可以使用以下方法调用它:
即-创建一个新的
Object
一个元素的数组-String
数组.使用您的变量名,它看起来像: