[关闭]
@lzb1096101803 2016-02-03T16:16:51.000000Z 字数 3240 阅读 471

14. 反射

面试 Java


Java反射机制的作用:
1)在运行时判断任意一个对象所属的类。
2)在运行时判断任意一个类所具有的成员变量和方法。
3)在运行时任意调用一个对象的方法
4)在运行时构造任意一个类的对象

java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;

  1. 何谓反射机制
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  2. 反射机制如何实现
    谈到反射机制,最诱人的莫过于“动态”二字了。接触过C语言的童鞋们都知道,C语言中也有个和“动态”搭上边的函数:malloc()函数。其实这里的两个动态是一个意思,都指的是非编译时处理,抑或运行时处理。这种机制,可以让程序的弹性增加不少,因为借由此机制,客户可以在程序运行时改变一些他关心的性质:分配内存(当然他可能 完全不知道这么做了),调用某个类(当然他还是被蒙在鼓里)等。

  3. 哪里用到反射机制?
    jdbc中有一行代码:Class.forName('com.mysql.jdbc.Driver.class').newInstance();那个时候只知道生成驱动对象实例,后来才知道,这就是反射,现在

很多框架都用到反射机制,hibernate,struts都是用反射机制实现的。
拦截器是基于 java 反射机制的

  1. 获取Class对象有三种方式:

    • 通过Object类的getClass()方法。例如:
      Class c1 = new String("").getClass();
    • 通过Class类的静态方法——forName()来实现:
      Class c2 = Class.forName("MyObject");
    • 如果T是一个已定义的类型的话,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象,例如:
      Class c3 = Manager.class;
      Class c4 = int.class;
      Class c5 = Double[].class;
  2. 反射机制的优缺点?

    import java.lang.reflect.Array;     
    import java.lang.reflect.Constructor;     
    import java.lang.reflect.Field;     
    import java.lang.reflect.Method;     
    
    
    /**   
     * Java Reflection Cookbook   
     *   
     * @author Michael Lee   
     * @since 2006-8-23   
     * @version 0.1a   
     */    
    
    public class Reflection {     
        /**   
         * 得到某个对象的公共属性   
         *   
         * @param owner, fieldName   
         * @return 该属性对象   
         * @throws Exception   
         *   
         */    
        public Object getProperty(Object owner, String fieldName) throws Exception {     
            Class ownerClass = owner.getClass();     
    
            Field field = ownerClass.getField(fieldName);     
    
            Object property = field.get(owner);     
    
            return property;     
        }     
    
        /**   
         * 得到某类的静态公共属性   
         *   
         * @param className   类名   
         * @param fieldName   属性名   
         * @return 该属性对象   
         * @throws Exception   
         */    
        public Object getStaticProperty(String className, String fieldName)     
                throws Exception {     
            Class ownerClass = Class.forName(className);     
    
            Field field = ownerClass.getField(fieldName);     
    
            Object property = field.get(ownerClass);     
    
            return property;     
        }     
    
    
        /**   
         * 执行某对象方法   
         *   
         * @param owner   
         *            对象   
         * @param methodName   
         *            方法名   
         * @param args   
         *            参数   
         * @return 方法返回值   
         * @throws Exception   
         */    
        public Object invokeMethod(Object owner, String methodName, Object[] args)     
                throws Exception {     
    
            Class ownerClass = owner.getClass();     
    
            Class[] argsClass = new Class[args.length];     
    
            for (int i = 0, j = args.length; i < j; i++) {     
                argsClass[i] = args[i].getClass();     
            }     
    
            Method method = ownerClass.getMethod(methodName, argsClass);     
    
            return method.invoke(owner, args);     
        }     
    
    
          /**   
         * 执行某类的静态方法   
         *   
         * @param className   
         *            类名   
         * @param methodName   
         *            方法名   
         * @param args   
         *            参数数组   
         * @return 执行方法返回的结果   
         * @throws Exception   
         */    
        public Object invokeStaticMethod(String className, String methodName,     
                Object[] args) throws Exception {     
            Class ownerClass = 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 = ownerClass.getMethod(methodName, argsClass);     
    
            return method.invoke(null, args);     
        }     
    
    
    
        /**   
         * 新建实例   
         *   
         * @param className   
         *            类名   
         * @param args   
         *            构造函数的参数   
         * @return 新建的实例   
         * @throws Exception   
         */    
        public Object newInstance(String className, Object[] args) throws Exception {     
            Class newoneClass = 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 = newoneClass.getConstructor(argsClass);     
    
            return cons.newInstance(args);     
    
        }     
    
    
    
        /**   
         * 是不是某个类的实例   
         * @param obj 实例   
         * @param cls 类   
         * @return 如果 obj 是此类的实例,则返回 true   
         */    
        public boolean isInstance(Object obj, Class cls) {     
            return cls.isInstance(obj);     
        }     
    
        /**   
         * 得到数组中的某个元素   
         * @param array 数组   
         * @param index 索引   
         * @return 返回指定数组对象中索引组件的值   
         */    
        public Object getByArray(Object array, int index) {     
            return Array.get(array,index);     
        }     
    }    
    
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注