mik*_*_x_ 0 java reflection constructor class
什么是Class[] null和Object[] null下面的代码是什么意思?
public Object selfFactory() {
Class cl = this.getClass();
Constructor cons;
cons = cl.getConstructor((Class[]) null);
return cons.newInstance((Object[]) null);
}
Run Code Online (Sandbox Code Playgroud)
cl.getConstructor((Class[]) null);将其值和类型的参数作为类型参数<T>,因此如果我们提供null Class[]的是null Objectfor 而不是for方法调用,则必须进行强制转换.getConstructor().
类似地,通过调用一个构造函数cons.newInstance((Object[]) null);创建一个新实例,cl该构造函数cons采用a Object[],如null本例所示.没有类型转换,Object将传递null .
这对于方法或构造函数重载时很有用.null没有强制转换的调用将是类型的Object,通常是模糊的:
{
eat(null); // ???
}
void eat(int[] arr);
void eat(Class arr);
Run Code Online (Sandbox Code Playgroud)
使用强制转换,可以调用正确的构造函数或方法.
{
eat((Class) null);
}
Run Code Online (Sandbox Code Playgroud)
另外,作为记录了polygenelubricants中如何使用可变参数和反思工作,
[...]
invoke(Object obj, Object... args)如果你需要传递一个引用类型数组作为唯一的参数,它会变得棘手,因为它是可以转换的Object[],即使它应该被包装在一个new Object[1]相反的内部.你可以做:
Run Code Online (Sandbox Code Playgroud)m.invoke(this, new Object[] {a}); // Bohzo's solution这绕过了vararg机制.你可以更简洁地做到:
Run Code Online (Sandbox Code Playgroud)m.invoke(this, (Object) a);
Object强制转换使vararg机制能够为您创建数组.将a
null作为参数传递给varargs 时也需要这个技巧,而且与反射无关.Run Code Online (Sandbox Code Playgroud)public void foo(String... ss) { System.out.println(ss[0]); } foo(null); // causes NullPointerException foo((String) null); // prints "null"