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

时间:2014-10-13 10:38:32

标签: java class reflection constructor

以下代码中Class[] nullObject[] null的含义是什么?

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

1 个答案:

答案 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}}