2012-09-12 154 views
1

创建带有参数的对象我不明白下面的代码:使用反射在构造

Constructor<T>[] constructors = (Constructor<T>[]) clazz.getConstructors(); 
for(int i = 0; i < constructors.length; i++){ 
    Constructor<T> constructor = constructors[i];  
    if (constructor.getParameterTypes().length>0){  
    T instanceObject = constructor.newInstance(new Object[constructor.getParameterTypes().length]); 
     break; 
    } 

}  

省略try/catch和其他东西的清晰度。
我不明白这是如何工作的:T instanceObject = constructor.newInstance(new Object[constructor.getParameterTypes().length]);
它调用一个构造函数,它有参数,但作为参数传递Object
这是如何工作的?独立于实际形式参数传递Object

+0

需要的所有参数为非原始及c TOR有道理瓦特/具有所有参数null – bestsss

+0

@bestsss:从Javadoc – Jim

+0

Jim中自动解开匹配原始形式参数的单个参数,但空值被解包到NPE。我知道规范甚至是impl,真的不需要引用。解包很简单:'Integer.intValue()','Double.doubleValue()' - 因此是NPE。 – bestsss

回答

1

它试图传递全部为null的虚拟参数。这可以给你一个对象,但这并不意味着它会成为一个有用的对象。 ;)

我不知道为什么它跳过零长度的构造函数,因为这是一个构造函数,您可能无法成功传递任何参数。

+0

也可以导致NPE,如果任何参数是原始的 – bestsss

+0

它可能会导致NPE,即使参数不是原始的,但期望您传递一些东西。 ;)我假设外部循环捕获异常,并继续尝试,如果它得到一个。 –

+1

我的意思是它甚至不会到达C-tor。当然,任何任意的数据都可能导致错误,但在w/primitives时,c-tor甚至不会被调用。 – bestsss

1

对象数组与等于在构造参数数目,因此要素数:

new Object[constructor.getParameterTypes().length]) 
相关问题