所以我读了一些XML的数据:
String arg1Value;
String arg2Value;
String arg2TypeAsString;
String arg1TypeAsString;
我想创建一个对象:ObjectType(arg1Type, arg2Type);
我正在尝试这个:
(ObjectType) Class.forName(arg1TypeAsString).getConstructor(arg1Type.class, arg2Type.class).newInstance(arg1Value, arg2Value)
但这给了我一个noSuchMethodException: ObjectType.<init>(arg1Type, arg2Type)
请注意,我正在尝试创建不同的对象,但它们都从ObjectType扩展而且所有参数都分别从arg1Type和arg2Type扩展。
答案 0 :(得分:0)
鉴于规范有点模糊(没有实际代码),请尝试以下方法:
private
,protected
或默认包修饰符,如果是,请使用getDeclaredConstructor()
ObjectType
class 将您的陈述分成多行:
Class<ObjectType> otClass = (ObjectType) class.forName(arg1TypeAsString);
Constructor<ObjectType> otConstructor = otClass.getConstructor(arg1Type.class, arg2Type.class);
ObjectType ot = otConstructor.newInstance(arg1Value, arg2Value);
答案 1 :(得分:-1)
我最初的假设是应该使用对象数组调用newInstance
。这是不正确的,请参阅下面的评论。然后可能的原因是您将原始类型传递给newInstance
,例如int
而不是Integer
。自然地创建对象数组将消除这种可能性。最后,我设法通过从目标类中删除构造函数来复制错误消息,因此无法找到它
java.lang.NoSuchMethodException: Foo.<init>(java.lang.String, java.lang.String)
请查看实现抛出的所有异常。请创建ObjectType
编译它并将其放在类路径中以便找到它。
这是我返回Object
的方法的实现,您可以将其转换为所需的类型
static Object createInstance(String clsName, String ctorType1, String ctorVal1, String ctorType2, String ctorVal2)
throws ClassNotFoundException, NoSuchMethodException, InstantiationException,
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
return Class.forName(clsName).getConstructor(Class.forName(ctorType1), Class.forName(ctorType2))
.newInstance(new Object[]{ctorVal1, ctorVal2});
}
经过测试和运作。很少有例外。您可能需要调整参数类型以使其符合您的设计要求。这是我的测试类
public class Foo {
public Foo(String in, String out){}
}