网站首页 > 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 ~
猜你喜欢
- 2024-10-04 java:jdk动态代理(jdk动态代理实现aop)
- 2024-10-04 Java中代理的理解及其实现方式(1)- 静态代理
- 2024-10-04 Java三种代理模式:静态代理、动态代理和cglib代理
- 2024-10-04 Java 学习笔记--反射与代理机制(静态、动态)
- 2024-10-04 Java的动态代理如何实现?#程序员(java动态代理有什么用)
- 2024-10-04 Java动态代理与静态代理以及它能为我们做什么
- 2024-10-04 Java - 动态代理实现原理以及ASM技术
- 2024-10-04 深入理解Java反射和动态代理(jdk动态代理和反射)
- 2024-10-04 java手把手教你写动态代理和静态代理的实现
- 2024-10-04 Java动态代理简单介绍(java动态代理的两种方式)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)