我有一个类,我在静态块中初始化了hashmap。通过密钥,我已经重新获得了一个类的值。为了为这个类创建对象。我使用了构造函数类来获取构造函数并传递参数并创建了对象。
我在hashmap中有两个类。要为EchoExpression创建object,我需要传递两个参数,对于OutExpression类,我只需要传递一个参数(String)。
基于键返回的类,我需要执行哪个构造函数来获取和实现,无论构造函数是带有一个参数还是两个参数。
在EchoExpression中,构造函数包含两个参数。
例如:
JXPathExpression check = new JXPathExpression(String expression, Class<?> type)
String属于String.class,但Class类型参数属于哪个类?这样我就可以用它来获取构造函数
public class ExampleFactory {
private static HashMap<String,Class<?>> hmap = new HashMap<String,Class<?>>();
static
{
hmap.put("echo", EchoExpression.class);
hmap.put("Out", OutExpression.class);
}
public void getExpo(String key,String expression)
{
Class aClass =map.get(key);
//Constructor implementation for OutExpression where only one argument string is passed
Constructor constructor = aClass.getConstructor(new Class[]{String.class});
Object object= constructor.newInstance(expression);
//Need constructor for passing two arguments string and class<?> for EchoExpression
return null;
}
}
答案 0 :(得分:2)
对于这样的事情,你应该在所有情况下都尝试使用统一的构造函数参数或者为每个类存储参数的方法。
现在提出您的问题。 Class<?>
是对未知类的引用。基本上对任何一个班级。使用它时,它或多或少等于Class<Object>
,因为所有类都以Object
为父级。
对于使用具有多个参数的构造函数,首先需要获取拟合构造函数。此时,它已经可以获取在类不支持具有此参数配置的实例时发生的错误。 以这种方式获取构造函数:
aClass.getConstructor(new Class[]{String.class, Object.class, ...});
这适用于任意数量的参数类型。然后以这种方式创建类的新实例:
constructor.newInstance(theString, theObject, ...);
函数newInstanace
根据需要实现为多个参数。因此,根据请求的构造函数需要多少个参数,newInstance
函数才能使用它。
对于你想要的所有......也许是一个提议:也许它可以选择不使用反射加载新对象,而是存储这些对象的实例并返回使用复制构造函数创建的对象的副本或{{1 }} 方法。在许多情况下,这样就不那么难了。
答案 1 :(得分:1)
也许你正在寻找的是Class.class,如:
Constructor constructor = aClass.getConstructor(new Class[]{String.class, Class.class});