使用java中的反射机制,我能够动态获取该变量或者对象的类型,获取出的类型是Class类型的,现在我有个问题:比方说,
String name = "MyName"; Class clazz = name.getClass();此时获取了该变量的类型,Object obj = (Object)clazz.getInstance();使用反射创建该类型的变量,使用该方法获取出的类型确实Object,实际上我们做程序的知道他获取出来应该是String类型的,可为了保证代码的通用性,我又不能确定不是所有的变量到底层都是同一个类型的,可我又不想使用Object类型尽享装箱操作,因为Object类型中的方法并不能满足我的需求,我需要知道的是传到底层方法的参数的实际类型是什么,并且能够使用获取的类型进行强制转换,那样我就可以获取出来时精确的类型,有没有办法实现我的这个需求,急急急急急急急急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    Class clazz = name.getClass();这个错误,应该是Class.forName(name);
    实际上我们做程序的知道他获取出来应该是String类型的,可为了保证代码的通用性
    ---
    这个就不明白了,如果你非常肯定它一定是String,则根本没有通用性的问题
    如果你的要求是这个obj符合一定的规范,那么通常是使用Interface,在其中定义方法IMyInterface obj = (IMyInterface)clazz.getInstance()这样调用方法就直接可以调用接口中的方法了
    如果你想知道它是什么类,obj.getClass()就会返回实际的类名了
      

  2.   

    给你个反射的应用类,希望对你有用。!import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    /**
     * Java Reflection
     * @author closewubq
     * @version 1.0
     */public class Reflection {
        /**
         * 得到某个对象的公共属性
         * @param obj
         *        某个对象
         * @param fieldName
         *        属性名称
         * @return 该属性对象
         * @throws Exception
         *
         */
        @SuppressWarnings("unchecked")
    public Object getField(Object obj, String fieldName) throws Exception {
            Class objclass = obj.getClass();
            Field field = objclass.getField(fieldName);
            Object property = field.get(obj);
            return property;
        }    /**
         * 得到某类的静态公共属性
         * @param className   
         *         类名
         * @param fieldName   
         *          属性名称
         * @return 该属性对象
         * @throws Exception
         */
        @SuppressWarnings("unchecked")
    public Object getStaticField(String className, String fieldName)
                throws Exception {
            Class obj = Class.forName(className);
            Field field = obj.getField(fieldName);
            Object property = field.get(obj);
            return property;
        }
        /**
         * 执行某对象方法
         * @param obj
         *            对象
         * @param methodName
         *            方法名
         * @param args
         *            参数
         * @return 方法返回值
         * @throws Exception
         */
        @SuppressWarnings("unchecked")
    public Object invokeMethod(Object obj, String methodName, Object[] args)
                throws Exception {
            Class objClass = obj.getClass();
            Class[] argsClass = new Class[args.length];
            for (int i = 0, j = args.length; i < j; i++) {
                argsClass[i] = args[i].getClass();
            }
            Method method = objClass.getMethod(methodName, argsClass);
            return method.invoke(obj, args);
        }
         /**
         * 执行某类的静态方法
         * @param className
         *            类名
         * @param methodName
         *            方法名
         * @param args
         *            参数数组
         * @return 执行方法返回的结果
         * @throws Exception
         */
        @SuppressWarnings("unchecked")
    public Object invokeStaticMethod(String className, String methodName,
                Object[] args) throws Exception {
            Class objclass = Class.forName(className);
            Class[] argsClass = new Class[args.length];
            for (int i = 0, j = args.length; i < j; i++) {
                argsClass[i] = args[i].getClass();
            }
            Method method = objclass.getMethod(methodName, argsClass);
            return method.invoke(null, args);
        }    /**
         * 根据类名创建实例
         * @param className
         *            类名
         * @param args
         *            构造函数的参数
         * @return  Object 
         *        新建的实例
         * @throws Exception
         */
        @SuppressWarnings("unchecked")
    public Object newInstance(String className, Object[] args) throws Exception {
            Class objcass = Class.forName(className);
            Class[] argsClass = new Class[args.length];
            for (int i = 0, j = args.length; i < j; i++) {
                argsClass[i] = args[i].getClass();
            }
            Constructor cons = objcass.getConstructor(argsClass);
            return cons.newInstance(args);    }
        
        /**
         * 判断一个对象是不是某个类的实例
         * @param obj 
         *         某个对象
         * @param objclass
         *        某个类
         * @return boolean
         *     如果 obj 是此类的实例,则返回 true
         */
        @SuppressWarnings("unchecked")
    public boolean isInstance(Object obj, Class objclass) {
            return objclass.isInstance(obj);
        }
    }
      

  3.   

    1楼方法蛮不错,你要对传进去的对象调用什么方法进行什么操作肯定也是自己知道的,让它实现接口直接调用方法就行了或者你要调用什么方法对该对象进行操作也可以传该方法的java.lang.reflect.Method参数,进行操作的时候就不用管具体是什么方法了
      

  4.   

    用名字来判断类啊....也可以根据Class对象里的方法变量来判断..不知道具体的应用是什么,可以说反射会让程序无所不能...
      

  5.   

    或者说继承一个抽象类BaseClass
    通过clazz.getSuperClass() == BaseClass.class来确定这个对象类型,再执行具体方法
      

  6.   


    对象的getClass方法和Class.forName(类的全称),返回的都是该类型的Class类型对象,如果你将二者用==去对比,会返现这两个对象的引用是相等的,原理可能是由于JVM加载类的机制引起的,可能大家误会我的意思了,上面的列子是String name ="ddd"; 我们可以通过name.getClass().getName()获取出的值是java.lang.String也就是String类型的全称,name.getClass()类型返回时String.class,name.getClass().getInstance()使用反射创建String类型的对象,可改返回值去时Object类型的,我有什么办法动态将其转换为对应的类型吗???
      

  7.   

    name.getClass()和Class.forName()根本是完全不一样的意思!!!!任何一个obj都有getClass()方法
    List l = new Array();   l.getClass()返回的是java.util.ArrayListString name = "ddd";
    name.getClass();这里和name的值,根本没有任何关系,你写"abc"效果是一样的。
    Class.forName()是反射中的功能,根本给定一个类的全名,获取这个类
    例如Class.forName("java.util.ArrayList");
    String name = "java.util.ArrayList";
    Class.forName(name);可改返回值去时Object类型的,我有什么办法动态将其转换为对应的类型吗???
    ---
    没有明白第一句话是什么意思
      

  8.   

    Class.forName("") 好像需要你本地有这个文件
      

  9.   

    你试着用一下Class.forName(String.class.getName)和String.class,还有就是创建一个String类型的对象,使用对象的getClass()方法的返回值,你将三个对比,三个对比的值都是true,这就能说明他们返回的都是String的Class对象信息,怎么不一样了
      

  10.   

    当你看到一个变量明显就知道他是什么类型的,可如果你做框架,封装底层代码时,那么多类型,难道你都要匹配对应的方法吗,这只是我的突发奇想,想hibernate中,你读取出来的数据是不是都要封装到对应的实体类的属性中,hiberante的实现也是基于jdbc的,我们从resultset中读取出某一列的值时,读出来的肯定是Object类型的,如果想要赋给对应的实体类的属性时,那样是不是要获取这个属性时什么类型的,要将Object类型强制转换成为属性对应的类型,我们通过反射机制能够获取出类中的某一属性对应的类型,可我们怎么基于获取出来的类型就行强制转换呢? 如果是基本类型的,我们可以通过Class对象的getName方法获取这个类型的完整名称,可以将所有的基本类型的和类全程存放到Map集合中区,那样可以比对全程,进行强制转换,可在hibernate中的一对多关系中,在一的方面如果是自动生成的实体隐射,那么应该有匹配的set集合。他的强制转换时 基于什么的呢???
      

  11.   

    Class.forName(String.class.getName())  String.class, "".getClass()
    这三个当然都是返回java.lang.String这个类的引用在hiberante中,如果是普通的字段,hibernate会判断应该使用哪个转换类来处理结果集的。
    例如一个POJO类中有一个属性int abc,那么hiberante会判断使用IntegerType这个转换类
    如果是一对多等关系,那么这个Set也是hibernate创建出的类,它会保留对方的实际类型
    例如:一个POJO类A中有一个方法public List<B> getB()那么hibernate创建的List中会记录实际类名为B,当你调用list.get(0)时,hibernate会通过类似于
    clz.newInstance()或者Proxy等方法创建出B类的实例。
      

  12.   

    Class.forName(String.class.getName())  String.class, "".getClass()
    这三个当然都是返回java.lang.String这个类的引用在hiberante中,如果是普通的字段,hibernate会判断应该使用哪个转换类来处理结果集的。
    例如一个POJO类中有一个属性int abc,那么hiberante会判断使用IntegerType这个转换类
    如果是一对多等关系,那么这个Set也是hibernate创建出的类,它会保留对方的实际类型
    例如:一个POJO类A中有一个方法public List<B> getB()那么hibernate创建的List中会记录实际类名为B,当你调用list.get(0)时,hibernate会通过类似于
    clz.newInstance()或者Proxy等方法创建出B类的实例。