在不知道构造函数参数的情况下从java反射创建对象
我正在尝试使用反射创建一组对象。我有这个班的名字。但在编译时,我们对构造函数一无所知。我使用了这个教程在不知道构造函数参数的情况下从java反射创建对象,java,reflection,Java,Reflection,我正在尝试使用反射创建一组对象。我有这个班的名字。但在编译时,我们对构造函数一无所知。我使用了这个教程 import java.lang.reflect.*; public class constructor2 { public constructor2() { } public constructor2(int a, int b) { System.out.println( "a = " + a + " b = " +
import java.lang.reflect.*;
public class constructor2 {
public constructor2()
{
}
public constructor2(int a, int b)
{
System.out.println(
"a = " + a + " b = " + b);
}
public static void main(String args[])
{
try {
Class cls = Class.forName("constructor2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Constructor ct
= cls.getConstructor(partypes);
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = ct.newInstance(arglist);
}
catch (Throwable e) {
System.err.println(e);
}
}
}
现在让我们假设我不知道构造函数的参数。(无论是默认构造函数还是两个整数)。构造器参数可以在不同的类中更改。我对Constructor2类一无所知。但是我有类名。
所以我不能像上面那样创建“argList”。你知道如何从构造函数中创建对象吗
我是这样做的
Constructor[] brickConstructorsArray = brickClass.getConstructors();
for (Constructor constructor : brickConstructorsArray) {
Class[] constructorParams = constructor.getParameterTypes();
Object argList[] = new Object[constructorParams.length];
int index = 0;
for (Class cls : constructorParams) {
if (cls.equals(Sprite.class)) {
Object spriteOb = foundSprite;
argList[index] = spriteOb;
} else if (cls.equals(double.class)) {
Object dblObj = new Double(0.0);
argList[index] = dblObj;
}
index++;
}
brickObject = (Brick) constructor.newInstance(argList);
}
这将适用于具有Sprite或双参数的costructor。为了包含其他可能性,我必须创建一个loooong if else链。需要帮助。你真的不在乎你要传递什么价值观吗?您可以拥有从每个基本类到其包装类型的默认值的映射:
// You can make this a static member somewhere
Map<Class<?>, Object> primitiveValues = new HashMap<Class<?>, Object>();
primitiveValues.put(char.class, '\0');
// etc
当然,我认为这会经常失败。毕竟,如果您对正在调用的构造函数一无所知,那么您就不知道哪些参数是有效的
这真的是您希望发现的有用的东西吗?但为什么您首先需要这样做?这就是为什么您要避免反射并找到更好的解决方案。这是实例化一系列相关类中任何类的对象所必需的。这种构造方法是徒劳的。所以我使用了ObjectOutPutStream类中的另一个方法,它创建了任何类的对象。
Constructor[] brickConstructorsArray = brickClass.getConstructors();
for (Constructor constructor : brickConstructorsArray) {
Class[] constructorParams = constructor.getParameterTypes();
Object argList[] = new Object[constructorParams.length];
// When you need the index, there's no point in using the enhanced
// for loop.
for (int i = 0; i < constructorParams.length; i++) {
// Fetching the value for any non-primitive type will
// give null, which is what we were going to use anyway.
argList[i] = primitiveValues.get(constructorParams[i]);
}
brickObject = (Brick) constructor.newInstance(argList);
}