现在的位置: 首页 > 综合 > 正文

如何根据字符串动态创建类对象

2014年01月21日 ⁄ 综合 ⁄ 共 2235字 ⁄ 字号 评论关闭

如何根据字符串动态创建类对象

       今天跟同事聊天的时候,同事有一个需求,就是如何根据类的名字和值,动态返回该类的实例对象。比如,我们给一个函数传入字符串类名”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

 

抱歉!评论已关闭.