如何根据字符串动态创建类对象
今天跟同事聊天的时候,同事有一个需求,就是如何根据类的名字和值,动态返回该类的实例对象。比如,我们给一个函数传入字符串类名”java.lang.String”和值“wuguowei”,则该函数则返回一个值为“wuguowei”的字符串对象。当然,我们也可以返回Integer对象、Long对象等,该函数可以实现动态的创建对象。
一、 枚举法
由于同事的需求只涉及到基本类型的创建,由于基本对象的个数是有限的(也就那么几个),所以我们这里可以用枚举的方式动态的创建想要的对象,虽然有些繁琐,但是还是可以实现我们的需求的。关键代码如下:
/** * 根据传入的类名和值,动态构造该类的实例 * * @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反射法
我们应该好好想想,这么NB的java语言应该没这么笨,应该有更简单的方法。经过同事的讨论后,发现一种比较好的方式。就是通过Constructor类反射出对应的类对象,接着再获取指定参数的构造函数,最后根据传入的值实例化对象即可得到我们想要的对象。通过这个方法,我们会发现我们的代码很简单,而且很容易懂。另外,这个方法可以动态构造任何java对象。闲话少说,直接看代码吧。具体代码如下:
/** * 根据传入的类名和值,动态构造该类的实例 * * @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 |