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 是基于 A*** 字节码处理框架,是通过修改字节码生成子类来生成的。
我们今天就暂时不讲解 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 ~