java用字符串动态创建对象
PublicDocDispatchpo=(PublicDocDispatch)objectDao.getBySql(PublicDocDispatch.class.get...
PublicDocDispatch po = (PublicDocDispatch) objectDao.getBySql(
PublicDocDispatch.class.getSimpleName(),
"where processId=" + piID);
其中PublicDocDispatch是一个实体类名,现在情况是PublicDocDispatch是动态的,我从一个XML配置文件中获得,也有可能是别的类名,我从XML能读出某个类名的字符串,比如我可以读出String a="PublicDocDispatch ",请问我该如何根据a得到po对象呢? 展开
PublicDocDispatch.class.getSimpleName(),
"where processId=" + piID);
其中PublicDocDispatch是一个实体类名,现在情况是PublicDocDispatch是动态的,我从一个XML配置文件中获得,也有可能是别的类名,我从XML能读出某个类名的字符串,比如我可以读出String a="PublicDocDispatch ",请问我该如何根据a得到po对象呢? 展开
4个回答
2015-10-20 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
/**
* 根据传入的类名和值,动态构造该类的实例
*
* @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;
}
* 根据传入的类名和值,动态构造该类的实例
*
* @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;
}
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();
}
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();
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-05-09
展开全部
可以自己写个工厂
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
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
由于涉及到基本类型的创建,由于基本对象的个数是有限的,所以我们这里可以用枚举的方式动态的创建想要的对象,关键代码如下:
/**
* 根据传入的类名和值,动态构造该类的实例
*
* @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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询