以下代码中Class[] null
和Object[] null
的含义是什么?
public Object selfFactory() {
Class cl = this.getClass();
Constructor cons;
cons = cl.getConstructor((Class[]) null);
return cons.newInstance((Object[]) null);
}
答案 0 :(得分:5)
cl.getConstructor((Class[]) null);
将其值和类型的参数作为类型参数<T>
,因此如果我们提供的是null
Class[]
而不是null
Object
方法调用.getConstructor()
。
同样,cons.newInstance((Object[]) null);
通过调用构造函数cl
来创建cons
的新实例,构造函数Object[]
采用null
,在这种情况下为Object
。如果没有类型转换,将传递空null
。
这对方法或构造函数重载时很有用。没有强制转换的Object
调用类型为{
eat(null); // ???
}
void eat(int[] arr);
void eat(Class arr);
且通常不明确:
{
eat((Class) null);
}
使用强制转换,可以调用正确的构造函数或方法。
invoke(Object obj, Object... args)
同样由polygenelubricants中的How to work with varargs and reflection记录,
[...]
Object[]
如果您需要将引用类型数组作为唯一参数传递,则会使其变得棘手,因为它可以转换为new Object[1]
,即使它应该包裹在m.invoke(this, new Object[] {a}); // Bohzo's solution
内。你可以这样做:
m.invoke(this, (Object) a);
这绕过了vararg机制。你可以更简洁地做到:
Object
转换为
null
使vararg机制能够为您创建数组。将
public void foo(String... ss) { System.out.println(ss[0]); } foo(null); // causes NullPointerException foo((String) null); // prints "null"
作为参数传递给varargs时也需要这个技巧,而且与反射无关。{{1}}