2012-06-25 40 views
2

如何反射性地构造函数,如果它的参数是Object ... objectsJava |反射性地获取构造函数

我的构造函数:

public MyClass (Object ... objects) 
    { 
    if (! (objects == null)) 
    { 
     if (objects.length > 0 && objects [ 0 ] instanceof Long) 
     { 
     setLatency ((Long) objects [ 0 ]) ; 
     } 
    } 
    } 

如何到现在:

Class<?> clazz = Class.forName ("MyClass") ; 

Constructor<?> clazzConstructor = clazz.getConstructor (Object [ ].class) ; 

我尝试做:

Long latency = 1000L ; 

MyClass myInstance = (MyClass) clazzConstructor.newInstance (latency) ; 

我也得到 java.lang.IllegalArgumentException异常:参数类型不匹配

如果延迟== null,则一切正常。

+0

如何'的newInstance(新的对象[] {}延迟)'? –

+0

我试过了,但还是不行。 –

+1

@Banthar它会工作,但是'newInstance()'本身就是可变参数。 – biziclop

回答

8

你的构造函数期待一个对象数组,但是你传递给它一个单独的Long

结束语latency成一个对象数组会的工作,但要小心,因为newInstance()本身期待Object ...,如果你通过它只不过是Object[],将它解释为参数列表。所以,你必须做这样的事情:

MyClass myInstance = (MyClass) clazzConstructor.newInstance ((Object)new Object[] { latency }) ; 

MyClass myInstance = (MyClass) clazzConstructor.newInstance (new Object[] { new Object[] { latency } }) ; 

第一个“傻瓜”编译成包装你的对象数组到另一个,第二个做它明确地代替。

(传递null,只是因为空为空,无论是参数声明的类型是什么。)

+0

虽然不是一个长期的对象吗? – jn1kk

+4

是的,但它不是一个数组。 – duffymo

+0

我试了一下,但还是不行。 –

7

尝试这种方式的对象作为参数的

MyClass myInstance = (MyClass) clazzConstructor 
     .newInstance(new Object[] { new Object[] { latency } }); 

newInstance(Object ... initargs)需求阵列。在构造函数中购买你的拳头参数也是对象数组Object... o,所以你需要在Object数组中重新包装它。

我这个代码和测试它似乎做工精细

class MyClass { 
    private Long latency; 

    public void setLatency(Long latency) { 
     this.latency = latency; 
    } 
    public Long getLatency() { 
     return latency; 
    } 

    public MyClass(Object... objects) { 
     if (!(objects == null)) { 
      if (objects.length > 0 && objects[0] instanceof Long) { 
       setLatency((Long) objects[0]); 
      } 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     Class<?> clazz = MyClass.class; 

     Constructor<?> clazzConstructor = clazz.getConstructor(Object[].class); 
     System.out.println(clazzConstructor); 

     Long latency = 1000L ; 
     MyClass myInstance = (MyClass) clazzConstructor 
       .newInstance(new Object[] { new Object[] { latency } }); 
     System.out.println(myInstance); 
     System.out.println(myInstance.getLatency()); 
    } 
} 
+0

非常感谢你的配合。 –