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

Java:用String str = ” “创建两个对象,两个String对象==为啥是false...
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。你现在是字符串,如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否...

java创建字符串对象 的意思是不是就是在堆内存开辟一个空间存放字符串...
方式一:String a = “aaa” ;方式二:String b = new String(“aaa”);两种方式都能创建字符串对象,但方式一要比方式二更优。因为字符串是保存在常量池中的,而通过new创建的对象会存放在堆内存中。常量池中已经有字符串常量”aaa”通过方式一创建对象,程序运行时会在常量池中查找”aaa”字符...

java下Class.forName的作用是什么,为什么要使用它
Class.forName(xxx.xx.xx)返回的是一个类Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段动态加载和创建Class对象,比如想根据用户输入的字符串来创建对象Stringstr=用户输入的字符串Classt=Class.forName(str);t.newInstance();classc=Class.forName...

Java 创建对象的四种方法
一、使用new方式创建对象是Java中最基本也是最常用的方法。通过new操作符,我们可以直接实例化一个类,从而创建出一个新对象。二、使用反射机制创建对象可以让我们在运行时动态地获取类信息,生成对象。这种灵活性在某些特定场景下非常有用,如动态加载类或对象。四、序列化创建对象是将对象的状态信息转换为...

如何在Java中动态创建一个类
"动态创建Reflect类");}}public class ReflectDemo {public static void main(String[] args) throws Exception {Class<?> Demo = Class.forName("demo.Reflect");Reflect test = (Reflect) Demo.newInstance();test.speak();}}测试结果:动态创建Reflect类,这是静态代码块动态创建Reflect类 ...

java 中 String str = "a" + "b" + "c";这样创建了几个对象 , 这样跟...
若这些字符串都是第一次出现,且java编译器,虚拟机都没有做优化的话,那么应该是5对象,分别是a,b,c,ab,abc 原因是String 对象是final修饰的也就是说,只能新建,不能修改,所以肯定得有5个对象。不过高版本的java编译器,或虚拟机都是有做优化的,那时候就不一定了。在不优化的情况下,肯定是...

JAVA创建对象有哪几种方式 ???
1.对于java命令中的每个命令行参数,Java虚拟机都会创建相应的String对象,并把它们组织到一个String数组中,再把该数组作为参数传给程序入口main(String args[])方法。2.程序代码中的String类型的直接数对应一个String对象,例如:执行完以上程序,内存中实际上只有两个String对象,一个是直接数,由Java...

JAVA 中,假如有如下一段代码,String a = "B" + "C" + "D"; 请问这个...
根据显示声明,会创建字符串a和B,C,D三个String对象 之后,编译器自动创建一个StringBuffer对象来拼接这三个字符 拼接完成后,编译器调用StringBuffer的toString方法,生成一个新String对象 最后把这个新对象作为值赋给a 整个过程,一共涉及到6个对象,其中5个是String对象。一共创建了4个String对象 ...

在java中类的初始化和对象的实例化有哪些区别,是先执行哪一步?_百度...
即只有有一个类对象(注意不是实例对象),无论你以后怎么个new法,新new的都是实例对象 问题二:heap(堆):用来动态生成内存的,如,属性,基本new出来的东西都在这里 stack(栈):局部变量 data segment(数据区):静态的变量,常量,包括字符串常量 code segment(代码区):编译后的代码http:\/...

JAVA String创建对象问题
问题1,创建了四个对象 这个问题一般是很容易混淆的两个概念: String s1="hello"; 与String s2=new String("hello");这两种写法jvm的内存分配时不一样的处理方式。String s1 ="hello";可能创建一个或者不创建对象,如果"hello"这个字符串在java String池里不存在,会在java String池里创建一个...

相似回答