Java 动态代理

Java 动态代理

动态代理其实是 Java 设计模式中的一种也是各大框架都多多少少会使用到的一种设计模式,因为这个设计模式还是比较常用也比较重要的,今天我就把我知道了解的设计模式-动态代理给你分享一下。

代理模式我们可以分为 动态代理静态代理

静态代理

由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。

代码案例

/**
 * 创建动物接口
 **/
public interface Animal {
    void run();
}

/**
 * 创建猫类
 * */
public class Cat implements Animal {
    
     // 实现 run 方法
    @Override
    public void run() {
        System.out.println("小猫咪正在跑~");
    }
}

/**
 * 创建动物代理类
 * */
public class AnimalProxy {
    
    private final Animal animal;
    
    public AnimalProxy(Animal animal) {
        this.animal = animal;
    }
    
    /**
     * 执行静态代理方法
     **/
    public void doProxy() {
        animal.run();
    }
}

动态代理

动态代理也会有两种,JDK 动态代理CGLIB 动态代理,这两个的区别:

Jdk 代理

1:这个是使用 Jdk 反射机制生成一个代理接口的匿名类,在调用方法前用 InvockHandler 这个接口的实现类类处理。

2:不需要依赖第三方的类库就可以直接实现

3:依赖于 interface 接口

Cglib 代理

1:Cglib 是基于 Asm 字节码处理框架,是通过修改字节码生成子类来生成的。

我们今天就暂时不讲解 CGLIB 的实现方式,暂时只讲解 DJK 方式的实现方式。

首先我们需要一个接口

public interface Animal {
    void run();
}

创建代理类

public class AnimalProxy implements InvocationHandler {
    
    private final Object target;
    
    public AnimalProxy(Object target) {
        this.target = target;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质,就是使用反射机制实现;
        System.out.println("动态代理被掉用 ~");
        return method.invoke(target, args);
    }
}

运行的类

public static void main(String[] args) {
	Cat cat = new Cat();
    Proxy.newProxyInstance(cat.getClass().getClassLoader(), cat.getClass().getInterfaces(), new AnimalProxy(cat));
}

static class Cat implements Animal {
    
    @Override
    public void run() {
        System.out.println("小猫咪正在通过动态代理跑步 ~");
    }
}

这就是一个简单的 Jdk 动态代理的小 DEMO ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值