当我试图让构造函数创建一个int
时,它抛出一个:java.lang.NoSuchMethodException: int.<init>(int)
我想做的事情的一个非常简化的版本如下:
Class myClass = int.class;
Constructor ctor = myClass.getConstructor(int.class);
我也试过以下方法:
Constructor ctor = myClass.getConstructor(Integer.TYPE);
Constructor ctor = myClass.getConstructor(Integer.class);
以相同的异常结束。是什么原因造成的呢?
编辑:
感谢所有的回复。我将包括下面的扩展示例。
我正在尝试执行上述操作,同时尝试调用对象的未知setter,其中我只有作为String传递给setter的值。
编辑后分辨率请注意,下面的代码只是为了清晰/上下文,并为简洁而编辑。
谢谢你的回复。我最终真正需要的是,是否有一种方法可以用与反射相关的方法创建一个原语(例如int)。选择的答案提供了一种使用相应包装器类的方法。
public class MyClass {
int field;
public void setField(int field) {
this.field = field;
}
}
public class Test {
public static void main(String... args) {
String value = "3"; // String of the the int value I want to pass to my setter as an argument when I invoke it via reflection
MyClass myObject = new MyClass();
Class objClass = myObject.getClass();
Method method = ... // Resolve the setter method using objClass.getMethods(); omitted here for brevity
Class[] paramTypes = method.getParameterTypes();
Class paramType = paramTypes[0]; // My setter method takes only one argument; so pick the first one
if (paramType.getName().equals("int")) {
Constructor ctor = paramType.getConstructor(int.class); // CAUSES EXCEPTION
Object instance = ctor.newInstance(value);
method.invoke(myObj, instance);
}
}
}
int
是一个基本类型,不可能具有与引用类型相同的初始化类型(使用构造函数)。我不认为它有int.<init>(int)
或int.<int>()
声明和可用的反射API。
Integer
来实现这个技巧,因为它定义了一个构造函数Integer(int)
。
Constructor<Integer> constructor = Integer.class.getConstructor(int.class);
Integer integer = constructor.newInstance(3);
System.out.println(integer); // prints out 3