从字符串创建对象

时间:2015-06-22 23:08:18

标签: java introspection

所以我读了一些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扩展。

2 个答案:

答案 0 :(得分:0)

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

  1. 确保您的构造函数没有privateprotected或默认包修饰符,如果是,请使用getDeclaredConstructor()
  2. ObjectType class
  3. 定义默认构造函数
  4. 将您的陈述分成多行:

    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){}
}