A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 活的精彩 中级黑马   /  2015-12-5 10:09  /  722 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.概述
        JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
        对于任意一个对象,都能够调用它的任意一个方法和属性;
        这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
        要想解剖一个类,必须先要获取到该类的字节码文件对象。
        而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。

2.反射获取字节码对象方式、创建对象的两种方式
        获取字节码方式三种:
        (1)类名.class,例如:System.class
        (2)对象.getClass(),例如:new Date().getClass();
        (3)Class.forName("类名"),例如:Class.forName("java.util.Date");
        创建对象的两种方式:
        (1)直接用字节码创建对象,只能调用默认的构造方法:字节码.newInstance();
        (2)获取构造方法Constructor,然后调用构造方法创建,可以通过参数不同调用不同的构造方式

3、通过反射获取带参构造方法并使用
        A,获取字节码文件对象
        Class.forName(String classPath)
       
       B.Class类提供了newInstance()方法,使用无参构造创建一个新对象
       
        C.通过字节码文件对象获取构造器对象
        getConstructor(Class... parameterTypes); // 获取公共构造中的一个       

        getDeclaredConstructor(Class... parameterTypes); // 获取所有中的一个
        setAccessible(true); // 取消java语言访问检查
               
        D.通过构造器对象创建类的实例
        Constructor类提供的newInstance(Object... parameters)
               

4、通过反射获取成员变量并使用
        A.获取字节码文件对象
        Class.forName(String classPath)
       
        B.通过字节码文件对象获取构造器对象
        getConstructor(Class... parameterTypes); // 获取公共构造中的一个
               
        getDeclaredConstructor(Class... parameterTypes); // 获取所有中的一个
        setAccessible(true);
               
        C.通过构造器对象创建类的实例
        Constructor类提供的newInstance(Object... parameters)
               
        D.通过字节码文件对象获取字段(Field) -- 成员变量、属性、域、字段
        getField(String name); // 获取公共字段中的一个
               
        getDeclaredField(String name);// 获取所有字段中的一个
        setAccessible(boolean flag); // 暴力访问(取消java语言访问检查)
               
        F.使用字段
        Field类的方法   set(Object obj, Object value); // 为obj对象的字段赋值为value
               

5、通过反射获取方法并使用 -- Method

        A.获取字节码文件对象
        Class.forName(String classPath)
       
        B.通过字节码文件对象获取构造器对象
        getConstructor(Class... parameterTypes); // 获取公共构造中的一个
               
        getDeclaredConstructor(Class... parameterTypes); // 获取所有中的一个
        setAccessible(true);
               
        C,通过构造器对象创建类的实例
        Constructor类提供的newInstance(Object... parameters)
               
        D,通过字节码文件对象获取方法
        getMethod(String name, Class... parameterTypes) // 获取公共中的一个(包含父类的)
       
        getDeclaredMethod(String name, Class... parameterTypes) // 获取所有中的一个(不包含父类的)
        setAccessible(true);
               
        F,通过方法对象执行方法
        Method类提供功能   Object invoke(Object obj, Object... objs) // 不必手动封装成数组new Object[]{obj1, obj2, obj3}
6、怎么理解反射,反射的应用
        反射就是把Java类中的各种成分映射成相应的Java类。
        一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方法来解决问题。
        反射是一个正好相反的过程,开始可能并没有类可以解决这个问题,而我们却先用一个当时可能并不存在的方法解决了这个问题,后来才有的这个类。
        这其实就是框架的原理,现有的框架再有的解决问题的类。框架描述了整体,制订了功能方法的规范,具体的实现之后按照这个规范编写。这些都需要靠反射来完成。
        使用框架有良好的扩展性,某部分功能的优化不需要涉及程序整体,只需要修改特定的部分就好了,然后通过配置文件,获取对应的类名,就可以了。

2 个回复

倒序浏览
反射真的可以解决很多代码复用的问题
回复 使用道具 举报
学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马