Java 反射:原始 int 原因的构造函数:java.lang.NoSuchMethodException:int.<init>(int)



当我试图让构造函数创建一个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

最新更新