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



Class[] nullObject[] null在下面的代码中是什么意思?

public Object selfFactory() {
    Class cl = this.getClass();
    Constructor cons;
    cons = cl.getConstructor((Class[]) null);
    return cons.newInstance((Object[]) null);
}

cl.getConstructor((Class[]) null);将其值和类型的参数作为类型参数<T>,因此如果我们为.getConstructor()的方法调用提供null Class[]而不是null Object,则强制转换是必要的。

类似地,cons.newInstance((Object[]) null);通过调用构造函数cons来创建cl的新实例,该构造函数采用Object[],在本例中给定为null。如果没有类型转换,将传递一个空的Object

这在重载方法或构造函数时非常有用。使用不带强制转换的null调用的类型为Object,并且通常不明确:

{
    eat(null); // ???
}
void eat(int[] arr);
void eat(Class arr);

通过强制转换,可以调用正确的构造函数或方法。

{
    eat((Class) null);
}

也如polygenelubricators在如何使用varargs和反射、中所记录的那样

[…]invoke(Object obj, Object... args)使得如果需要将引用类型的数组作为唯一参数传递时变得很棘手,因为它可以强制转换为Object[],即使它应该封装在new Object[1]中。

你可以做:

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

这绕过了vararg机制。更简洁地说,你也可以做:

m.invoke(this, (Object) a);

Object的强制转换使vararg机制为您完成创建数组的工作。

当将null作为参数传递给varargs时,也需要该技巧,并且与反射无关。

public void foo(String... ss) {
    System.out.println(ss[0]);
}
    foo(null); // causes NullPointerException
    foo((String) null); // prints "null"

相关内容

  • 没有找到相关文章

最新更新