静态代理和动态代理

代理就是 A找B做事,C看到的是B在做事,看不到A;
我个人认为,就是加了一层。Java这边没有什么事情,是加一层结构解决不了的。
意义在于,B可以对A做的事情,进行拦截和加强,同时也可以记录日志等信息, 并且不用修改A的源代码,一个安全,一个扩展了。
Spring的AOP切面编程,其实就是这个原理。

静态代理:

对比现实生活的中介、婚介等等。
为什么叫静态代理:因为这个代理类是通过固定的代码定义的,不是由代码动态生成的类。

  1. 首先定义一个接口I
  2. A和B都去实现这个接口I
  3. 其中B是代理类,定义一个成员变量是A的对象
  4. B执行方法的同时,代用A对象来执行方法。

动态代理:

与静态代理相比,就是能动态生成。

  1. 首先定义一个工具类实现InvocationHandler
  2. 然后定义一个Object的成员变量
  3. 实现invoke方法
  4. 新建这个工具类对象,传入需要被代理的对象,然后执行invoke方法。
  5. 这个工具类会根据传入的不同对象,生成不同的代理类。(这个可能就是动态吧,我觉得就是加了一层。)
/**
 * Author:ckvsok
 * Date:2021/4/6
 **/

package com.ckvsok.proxy;


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

//这个类用来自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {

    //被代理的接口
    private Object target;

    public void setTarget(Rent rent) {
        this.target = target;
    }

    //获取代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);

    }

    //处理调用并返回结果 method是通过反射获取的原类的方法,args可以传入参数
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        seeHouse();
        Object result = method.invoke(target, args);
        fare();

        return result;
    }

    //这个是中介的方法1,可以放在原类方法之前,或者之后执行。
    public void seeHouse(){
        System.out.println("中介带看房子");
    }
    //这个是中介的方法2
    public void fare(){
        System.out.println("收中介费");
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值