我有Class
个对象,clazz
。我想制作那个类型的对象。
即。 Class clazz = MTable.getClass(tableName);
变量clazz
可以是MOrder.class
,MInventory.class
或MSalary.class
类型。
现在我想为一个实例创建MOrder
的对象。
如果不将clazz
与MOrder.class
进行比较,我该如何创建MOrder
的对象。
Java是否提供任何此类机制?
更新
我试过了:
Class<? extends DocAction> clazz = (Class<? extends DocAction>) MTable.getClass(re.tableName);
DocAction instance = null;
try {
instance = clazz.newInstance();
} catch (InstantiationException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
但抛出异常:
java.lang.InstantiationException:org.compiere.model.MOrder
答案 0 :(得分:3)
尝试:
Object object = clazz.newInstance()
答案 1 :(得分:3)
Object object = clazz.newInstance();
将根据clazz
的值创建实例。
如果要将对象存储在MOrder
变量中,则必须先检查其类型:
MOrder order = null;
if (object instanceof MOrder) {
order = (MOrder) order;
}
您无法避免对类型进行测试,因为正如您所说,clazz
可能包含不同的类实例。
如果所有类都实现了DocAction接口,则可以执行以下操作:
Class<? extends DocAction> clazz = ...
DocAction instance = clazz.newInstace();
这至少可以为您提供接口类型的参考。如果要将实例存储在更具体的变量中,您仍需要检查特定类型。
答案 2 :(得分:1)
@Saj,类对象不是由类继承的,因此MOrder.class或MInventory.class不能是Class对象的类型。所有对象都继承自Object类,甚至Class对象也继承自Object类。所以,你的逻辑似乎不正确。用其他方式思考,了解要创建哪种类型的对象。