java用字符串动态创建对象

PublicDocDispatch po = (PublicDocDispatch) objectDao.getBySql(
PublicDocDispatch.class.getSimpleName(),
"where processId=" + piID);
其中PublicDocDispatch是一个实体类名,现在情况是PublicDocDispatch是动态的,我从一个XML配置文件中获得,也有可能是别的类名,我从XML能读出某个类名的字符串,比如我可以读出String a="PublicDocDispatch ",请问我该如何根据a得到po对象呢?

/**
* 根据传入的类名和值,动态构造该类的实例
*
* @param _sClassName
* 要构造的类名 如:java.lang.String
* @param _sRealValue
* 要创建的对象的值,比如“wuguowei”
* @return 返回String对象,即值为“wuguowei”的字符串
* @throws Exception
*/
private Object getAttributeObject(String _sClassName, String _sRealValue)
throws Exception {

//1.加载类对象
Class attrObjClass = Class.forName(_sClassName);

//2.如果是Long类
if (attrObjClass.isInstance(new Long(0))) {
return new Long(_sRealValue);
}

//3.如果是Integer类
if (attrObjClass.isInstance(new Integer(0))) {
return new Integer(_sRealValue);
}

//4.其他类型……

//5.返回当前类的实例对象
return attrObjClass;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-09
类似这样动态创建对象的,都是用到JAVA的反射机制来实现的,有时间去研究一下吧。给个代码。try {
Class c =Class.forName("java.lang.String");
String s = (String)c.newInstance();
System.out.println(s.getClass().getName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}本回答被网友采纳
第2个回答  2013-05-09
可以自己写个工厂
第3个回答  2015-10-28
一、 枚举法
由于涉及到基本类型的创建,由于基本对象的个数是有限的,所以我们这里可以用枚举的方式动态的创建想要的对象,关键代码如下:

/**

* 根据传入的类名和值,动态构造该类的实例

*

* @param _sClassName

* 要构造的类名 如:java.lang.String

* @param _sRealValue

* 要创建的对象的值,比如“wuguowei”

* @return 返回String对象,即值为“wuguowei”的字符串

* @throws Exception

*/

private Object getAttributeObject(String _sClassName, String _sRealValue)

throws Exception {

//1.加载类对象

Class attrObjClass = Class.forName(_sClassName);

//2.如果是Long类

if (attrObjClass.isInstance(new Long(0))) {

return new Long(_sRealValue);

}

//3.如果是Integer类

if (attrObjClass.isInstance(new Integer(0))) {

return new Integer(_sRealValue);

}

//4.其他类型……

//5.返回当前类的实例对象

return attrObjClass;

}

上面的代码虽然可以通过枚举的方式实现,但是很繁琐,需要对每个对象进行枚举,这里还只支持传入一个String类型的参数,如果要传入多个参数,那么这个函数的逻辑将会很复杂。
二、 Constructor反射法
通过Constructor
类反射出对应的类对象,接着再获取指定参数的构造函数,最后根据传入的值实例化对象即可得到想要的对象。具体代码如下:

/**

* 根据传入的类名和值,动态构造该类的实例

*

* @param _sClassName

* 要构造的类名 如:java.lang.String

* @param _sRealValue

* 要创建的对象的值,比如“wuguowei”

* @return 返回String对象,即值为“wuguowei”的字符串

* @throws Exception

*/

private Object getAttributeObject1(String _sClassName, String _sRealValue)

throws Exception {

// 1. 根据指定的类名,获取到对应的类

Class clazz = Class.forName(_sClassName);

// 2. 获取指定参数类型的构造函数,这里传入我们想调用的构造函数所需的参数类型

Constructor constructor = clazz.getConstructor(String.class);

// 3. 根据构造函数,创建指定类型的对象,传入的参数个数需要与上面传入的参数类型个数一致

Object object = constructor.newInstance(_sRealValue);

// 4.返回对象

return object;

}

三、 执行代码
调用上边的代码如下:

CreateClassByString aCreateClassByString = new CreateClassByString();

Object oObject = aCreateClassByString.getAttributeObject1(

"java.lang.String", "wuguowei");

System.out.println("结果::"+oObject);

执行结果如下:

结果::wuguowei
相似回答