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

mike_x_

什么是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>,因此如果我们提供的null Class[]而不是null Objectfor方法调用,则必须进行强制转换.getConstructor()

类似地,通过调用采用的构造函数cons.newInstance((Object[]) null);创建的新实例,在这种情况下,给出了如果没有类型转换,则将传递null clconsObject[]nullObject

当方法或构造函数重载时,这很有用。null不带强制转换的调用将是这种类型,Object并且通常是模棱两可的:

{
    eat(null); // ???
}

void eat(int[] arr);
void eat(Class arr);

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

{
    eat((Class) null);
}

同样如多基因润滑剂如何使用可变参数和反射中所述

invoke(Object obj, Object... args)如果您需要将引用类型的数组作为唯一的参数传递,则[...]变得棘手,因为它可以强制转换为Object[],即使应将其包装在a内new Object[1]

你可以做:

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

这绕过了vararg机制。更简洁地说,您还可以执行以下操作:

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

Object强制转换为vararg机制可以为您创建数组。

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

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

    foo(null); // causes NullPointerException
    foo((String) null); // prints "null"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章