使用反射在java中创建动态对象

mik*_*_x_ 0 java reflection constructor class

什么是Class[] nullObject[] 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)

Uni*_*ron 5

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]相反的内部.

你可以做:

m.invoke(this, new Object[] {a}); // Bohzo's solution
Run Code Online (Sandbox Code Playgroud)

这绕过了vararg机制.你可以更简洁地做到:

m.invoke(this, (Object) a);
Run Code Online (Sandbox Code Playgroud)

Object强制转换使vararg机制能够为您创建数组.

将a null作为参数传递给varargs 时也需要这个技巧,而且与反射无关.

public void foo(String... ss) {
    System.out.println(ss[0]);
}

    foo(null); // causes NullPointerException
    foo((String) null); // prints "null"
Run Code Online (Sandbox Code Playgroud)