Java 从字符串创建对象

Java 从字符串创建对象,java,introspection,Java,Introspection,因此,我从XML中读取了一些数据: String arg1Value; String arg2Value; String arg2TypeAsString; String arg1TypeAsString; 我想创建一个对象:ObjectType(arg1Type,arg2Type) 我正在尝试这个: (ObjectType) Class.forName(arg1TypeAsString).getConstructor(arg1Type.class, arg2Type.class).newIn

因此,我从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。(arg1Type,arg2Type)


请注意,我正在尝试创建不同的对象,但它们都是从ObjectType扩展而来的,并且它们的所有参数都分别从arg1Type和arg2Type扩展而来。

我最初的假设是应使用对象数组调用
newInstance
。这是不正确的,请参阅下面的评论。可能的原因是您正在将原语类型传递给
newInstance
,例如
int
,而不是
Integer
。自然地,创建对象数组将消除这种可能性。最后,我通过从目标类中删除构造函数来复制错误消息,以便找不到它

java.lang.NoSuchMethodException: Foo.<init>(java.lang.String, java.lang.String)
它已经过测试,可以工作了。很少有例外。您可能需要调整参数类型,使其符合设计要求。这是我的测试课

public class Foo {
  public Foo(String in, String out){}
}

鉴于规范有点模糊(没有实际代码),请尝试以下操作:

  • 确保您的构造函数没有
    private
    protected
    或默认包修饰符,如果有,请改用
    getDeclaredConstructor()
  • ObjectType
    类定义默认构造函数
  • 将语句拆分为多行:

    Class<ObjectType> otClass = (ObjectType) class.forName(arg1TypeAsString);
    Constructor<ObjectType> otConstructor = otClass.getConstructor(arg1Type.class, arg2Type.class);
    ObjectType ot = otConstructor.newInstance(arg1Value, arg2Value);
    
    Class otClass=(ObjectType)Class.forName(arg1TypeAsString);
    构造函数otConstructor=otClass.getConstructor(arg1Type.class,arg2Type.class);
    ObjectType ot=otConstructor.newInstance(arg1Value,arg2Value);
    

  • 谷歌搜索揭示了这一点——我是一个C#家伙,所以我自己也帮不了你:你能提供更多细节吗?
    arg1Type
    arg2Type
    的值是多少?
    ObjectType
    类看起来像什么?@Raniz argtype可以是不同的,有时是双字符串;或者像int,string之类的东西。ObjectType是一个抽象类,但我想让从itSo扩展的类的对象使用构造函数
    ObjectType
    ObjectType(arg1Type,arg2Type)
    是否存在?@FilipBulovic否,但我有几个从ObjectType扩展的类,所有这些类都将从arg1Type扩展的参数作为第一个参数,将从arg2Type扩展的参数作为第二个参数。这不是OP的问题。是varargs方法,因此无需显式创建
    对象
    数组。
    Class<ObjectType> otClass = (ObjectType) class.forName(arg1TypeAsString);
    Constructor<ObjectType> otConstructor = otClass.getConstructor(arg1Type.class, arg2Type.class);
    ObjectType ot = otConstructor.newInstance(arg1Value, arg2Value);