彷徨 | 反射大纲

1. 学习反射之前 需要了解类加载器

 一句话,任何类在使用的时候系统将先将类的class文件加载到内存


2. 什么是反射:
    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
    对于任意一个对象,都能够调用它的任意一个方法和属性;
    这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    
3. 使用反射
    要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖这个类,使用的就是Class类中的方法,所以先要获取到每一个字节码文件所对应的Class类型对象。
    3.1 获取class对象的三种方式
    3.1.1 类名.calss
          实例: Class clazz = Demo3.class;
    3.1.2 通过对象获得  对象.getClass();
          实例: Demo3 demo = new Demo3();
                      Class clazz = demo.getClass();
    3.1.3 通过全类名获得(常用) Class.forName("全类名(包名加类名)")
          实例:Class clazz = Class.forName("cn.itcast.com.Demo3");
4. 使用字节码对象获取类的构造
    4.1 获取无参构造方法
        Constructor<T> getConstructor() 
        返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
    4.2 获取有参构造
        Constructor<T> getConstructor(Class<?>... parameterTypes) 
        返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 
    4.3 获取私有构造
        Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 
        返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。 
        经过测试在jdk1.8环境下 只要调用getDeclaredConstructor就可以获取私有的构造,                                                                        不需要暴力访问 constructor.setAccessible(true);
    
    4.4 使用反射获取方法和执行方法
        获取public方法:clazz.getMethod("方法名称",参数类型);
        执行方法(无参数):
        Class clazz = Class.forName("cn.itcast.com.Person");
        Object obj = clazz.newInstance();
        Method method = clazz.getMethod("getAge");
        System.out.println(method);
        method.invoke(obj);
        获取有参数的方法并执行:
        Class clazz = Class.forName("cn.itcast.com.Person");
        Object obj = clazz.newInstance();
        Method method = clazz.getMethod("show", String.class, int.class);
        System.out.println(method);
        method.invoke(obj, "范三",16);
    4.5 获取private方法
        代码略过...
    4.5 获取字段
        代码略过...
        
5. Dom4j解析xml并使用反射给对象的属性赋值(综合案例)
        反射、XML
    读取XML中的配置文件信息,使用BeanUtils工具类创建JavaBean对象,将XML中的数据保存到JavaBean类的属性中(难度系数:*****)
    操作需求:
        使用SAXReader对象解析XML配置文件
        将解析到的数据通过BeanUtils工具类封装进JavaBean类中
    要求:
    备注:
    分析:
        思想:不直接操作JavaBean,而是通过xml文件来操作JavaBean
            dom4j解析xml
            反射获取JavaBean的对象
            获取属性名称和属性值
            BeanUtils.setProperty(对象,属性名称,属性值)
            1. 根据xml文件创建相应的javaBean 和 属性
            2. 解析xml文件。获取<bean>标签的className的属性值
            3. BeanUtils.setProperty(Obj,属性名称,属性值);

6. 动态代理
    6.1 为什么要使用动态代理?
            假如范三同学自己提供了一个公共的方法addFruit()方法,日天同学想调用。但是日天同学想给这个方法再添加一些功能比如先提示一句添加水果 怎么办?
            方法1. 揍范三一顿,勒令他修改addFruit()方法的源码
            System.out.println("添加水果成功");
            方法2. 惹不起范三,自己从新写一个addFruit()方法,把自己需要的功能加上去
            方法3. 使用动态代理 
            动态代理的使用
            1. 代理类需要实现InvocationHandler接口,并重写invoke()方法
            2. 
            动态代理使用前提:必须有接口

            Object proxyObj = Proxy.newProxyInstance(参数1,参数2,参数3);
            参数1:ClassLoader,负责将动态创建类,加载到内存。当前类.class.getClassLoader();
            参数2:Class[] interfaces ,代理类需要实现的所有接口(确定方法),被代理类实例.getClass().getInterfaces(); 
            参数3:InvocationHandler, 请求处理类,代理类不具有任何功能,代理类的每一个方法执行时,调用处理类invoke方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值