反射及动态代理模式

0821 Mark老师 反射及动态代理模式:
泛型复习:
为什么需要泛型?
泛型方法辨识
限定类型变量
泛型类、接口、方法
泛型中的约束和局限性
泛型类型的继承规格
通配符类型
虚拟机是如何实现泛型的?

反射(Reflect):
反射是一开始并不知道我要初始化的类对象是什么,
自然也无法使用new关键字来创建对象了,这时候我们
就使用JDK提供的反射API进行反射调用。  
【各种框架,比如Retrofit】
反射就是在运行时才知道操作的类是什么并且可以在运行时
获取类的完整构造,并调用对应的方法。
getMethods:获取子类所有公有方法和父类的所有方法
getDeclareMethod :获取当前类的所有方法(私有和公有方法)

Class: Field、Constructor、Method
我们写的每一个类都可以看成一个对象,是java.lang.Class类的对象。

代理模式那些事
定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
目的:
(1)通过引入代理对象的方式来间接访问目标对象,防止直接
访问目标对象给系统带来的不必要复杂性
(2)通过代理对象对原有的业务增强

代理模式:中介
张三  <---> Mark代购  <---> A用品公司

抽象角色:
接口: 买东西
A用品公司接口:  <<接口>>Subject  抽象对象
RealSubject: 真实对象
Proxy :Mark老师 代理对象
张三:访问者

代理模式:
静态代理违反了开闭原则,对修改关闭,对新增开放
静态代理:扩展能力差,可维护性差
张三、张三老婆、李四... ...

代码实现:略

开闭原则:新增的业务对原有的业务不改变

解决这样的问题,jdk就引入了动态代理的问题

动态代理那些事
Mark海外代购公司

张三          Mark海外代购公司             A用品公司
张三老婆      Mark海外代购公司             B用品公司

动态代理优点:运行的时候才会产生代理类和代理对象。
缺点:
运行效率比静态代理效率低,应用场景受限

Proxy:海外代购公司 
InvocationHandler:客户口碑,优质的代购服务

代码实现:略
Proxy:拿到动态代理的对象
// 第一个参数:真实对象类加载器
// 第二个参数:真实对象类的接口
// 第三个参数: 实现接口
Proxy.new PeoxyInstance();

MarkCompany markCompany = new MarkCompany();
markCompany.setFactory(aafactory);
Aafactory ac = markCompany.getProxyInstance();
ac.setWomanTools(1.9f);

package com.xiaowei;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理
 * <p>Title: MarkCompany</p>  
 * <p>Description: </p>   
 * <p>Copyright: Copyright (c) 2019</p>  
 * @author weip
 * @date:2022年8月21日 上午11:12:43   
 * @version 1.0   
 * 注意:本内容仅限于内部传阅,禁止外泄以及用于其他的商业目
 */
public class MarkCompany implements InvocationHandler{
    /** 持有的真实对象 **/
    private Object factory;
    
    public Object getFactory() {
        return factory;
    }

    public void setFactory(Object factory) {
        this.factory = factory;
    }
    
    /** 通过Proxy获取动态代理对象 **/
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(
                factory.getClass().getClassLoader(),
                factory.getClass().getInterfaces(),
                this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        doSthBefore();
        // 动态代理,做了增强
        Object result = method.invoke(factory, args);
        doSthAfter();
        return result;
    }

    /** 后置处理器 **/
    private void doSthAfter() {
        System.out.println("精品包装一条龙服务");
    }

    /** 前置处理器 **/
    private void doSthBefore() {
        System.out.println("考察市场,了解用户需求");
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值