Svi*_*nko 2 java reflection constructor
如果它的参数是,我如何反射性地得到构造函数Object ... objects.
我的构造函数:
public MyClass ( Object ... objects )
{
if ( ! ( objects == null ) )
{
if ( objects.length > 0 && objects [ 0 ] instanceof Long )
{
setLatency ( ( Long ) objects [ 0 ] ) ;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我现在怎么做到的:
Class< ? > clazz = Class.forName ( "MyClass" ) ;
Constructor< ? > clazzConstructor = clazz.getConstructor ( Object [ ].class ) ;
Run Code Online (Sandbox Code Playgroud)
我尝试做什么:
Long latency = 1000L ;
MyClass myInstance = ( MyClass ) clazzConstructor.newInstance ( latency ) ;
Run Code Online (Sandbox Code Playgroud)
我得到java.lang.IllegalArgumentException:参数类型不匹配
如果latency == null,一切正常.
你的构造函数期望一个对象数组,但你传递一个对象数组Long.
包装latency到一个对象数组中会起作用,虽然要小心,因为newInstance()它本身期望Object ...,如果你只传递它Object[],它会将它解释为一个参数列表.所以你必须做这样的事情:
MyClass myInstance = ( MyClass ) clazzConstructor.newInstance ( (Object)new Object[] { latency } ) ;
Run Code Online (Sandbox Code Playgroud)
要么
MyClass myInstance = ( MyClass ) clazzConstructor.newInstance ( new Object[] { new Object[] { latency } } ) ;
Run Code Online (Sandbox Code Playgroud)
第一个"愚弄"编译器将您的对象数组包装到另一个中,第二个明确地代替它.
(传递null仅起作用,因为null为null,无论参数的声明类型是什么.)
试试这种方式
MyClass myInstance = (MyClass) clazzConstructor
.newInstance(new Object[] { new Object[] { latency } });
Run Code Online (Sandbox Code Playgroud)
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());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2449 次 |
| 最近记录: |