如何在下面修复我的代码?
package mypackage;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class testReflection {
public class You {
public You(String s) {
}
public void f(String s, int i) {
System.out.println(i + 100);
}
}
public static void main(String[] args) throws NoSuchMethodException {
Constructor constructor =
You.class.getConstructor(testReflection.class, String.class);
try {
You y = (You)constructor.newInstance("xzy");//Exception!!!!
System.out.println("ok");
y.f("xyz",2);
}catch(Exception e){
e.printStackTrace();
}
}
}
异常消息是:
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at mypackage.testReflection.main
答案 0 :(得分:5)
来自Constructor#newInstance
的{{3}}:
如果构造函数的声明类是非静态上下文中的内部类,则构造函数的第一个参数必须是封闭的实例;请参阅Java™语言规范的15.9.3节。
由于You
是一个内部类,因此需要其封闭类testReflection
的实例来创建You
的实例。为此,可以使用以下命令:
You y = (You) constructor.newInstance(new testReflection(), "xzy");
我还建议您按照正确的命名约定将您的类名更改为TestReflection
。
答案 1 :(得分:2)
提示在此行上(构造函数使用2个参数):
Constructor constructor =
You.class.getConstructor(testReflection.class, String.class);
您需要将testReflection
的实例发送到newInstance()
:
testReflection outerObject = new testReflection();
You y = (You)constructor.newInstance(outerObject, "xzy");