2

そのパラメーターが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: argument type mismatch を取得します

latency == null の場合、すべてが機能します。

4

2 に答える 2

7

こうやってみる

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

newInstance(Object ... initargs)引数としてオブジェクトの配列が必要です。コンストラクターの最初の引数もオブジェクトの配列であるObject... oため、オブジェクト配列で再度ラップする必要があります。

このコードでテストしたところ、問題なく動作するようです

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());
    }
}
于 2012-06-25T14:05:12.240 に答える