Java |反思地获取构造函数

时间:2012-06-25 13:57:14

标签: java reflection constructor

如果构造函数的参数是Object ... objects,我如何能够反思地获取构造函数。

我的构造函数:

  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:参数类型不匹配

如果latency == null,一切正常。

2 个答案:

答案 0 :(得分: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只能起作用,因为null为null,无论声明的参数类型是什么。)

答案 1 :(得分: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());
    }
}