使用Java反射创建对象

时间:2017-04-04 13:37:48

标签: java reflection

我从外部源字符串接收,这些字符串几乎是对象构造函数的签名。它们包含类名和参数。

例如:

public class Foo {
  public Foo(int x, int y, int z) {
    // do something
  }
}

public class Bar {
  public Bar (int x, boolean bool) {
    // do something
  }
}

假设我有很多这样的类,我想根据我收到的字符串(包含类名和参数)从这些类创建对象。可以这样做吗?

我知道我可以使用类似的东西来上课:

String className = "myClass";
Class<?> myClass = Class.forName(className);
//Constructor<?> ctor = myClass.getConstructor();
//Object object = ctor.newInstance(new Object[] { ctorArgument });

但是如果我在编译时不知道构造函数将具有多少个参数以及它们将是哪种类型,我怎样才能实例化该对象?顺便说一下,我想要创建对象的类很可能只有一个构造函数可用。但是每个类可能与另一个类相比具有不同的构造函数。

1 个答案:

答案 0 :(得分:0)

没问题,因为newInstance()方法收到一个数组:

public T newInstance(Object ... initargs)

所以你只需要初始化一个包含所有参数的数组并传递它

类似的东西:

String[] argsAsString = readValuesFromString(data);
Object[] args = new Object[argAsString.length()];
int i = 0;
Class<?>[] paramTypes = ctor.getParameterTypes();
for (String argStr: argsAsString) {
    args[i] = convertStringToActualType(argStr, paramTypes[i]);
    i++;
}

ctor.newInstance(args);

您可能需要在类上调用getConstructors(),然后尝试使用正确数量的参数查找构造函数。只有当您没有两个或更多具有相同参数数量的构造函数时,这才有效。 然后convertStringToActualType()应该知道如何将字符串值转换为实际参数..例如,如果它是布尔字段`Boolean.valueOf(argStr)'等 - 例如:

Object convertStringToActualType(String arg, Class<?> type) {
    if (type == String.class)
        return arg;
    if (type == Boolean.class)
        return Boolean.valueOf(arg);
    throw new IllegalArgumentException("type " + type.getSimpleName() + " not supported");
}