AOP 代理模式(动态代理)
不需要手动创建动态代理类,而是通过jdk中提供的API然后动态的为某个目标类创建所对应动态代理类。
jdk提供的API带代码运行的过程中动态的创建每一个目标类所对应的动态代理类。

JDK本身就支持动态代理,这是反射技术的一部分。
package com.atguigu.spring.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
/**
* 是动态生成目标类所对应的代理类(相当于工具类),所以叫工厂,就是专门生产代理类的
*/
public class ProxyFactory {
/**
* 目标对象:因为现在是针对任何的目标类来创建代理类的
* 所以类型写Object
*/
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
//创建一个方法
public Object getProxy(){
/**
* 使用动态代理的方法:jdk动态代理,使用的API就是Proxy
* 来创建一个代理实例,通过这个方法创建动态代理类动态代理对象
* 里面有三个参数:1.类加载器 2.接口 3.对象
* 1. ClassLoader loader:指定加载动态生成的代理类的类加载器
* 类想要执行,必须要被加载,类的加载需经过类的加载器加载
* 类加载器:
* ①根类加载器:底层是c来实现的,获取的时候,只要加载一些核心类库
* ②扩展类加载器:加载的是扩展类库
* ③应用类加载器:自己写的一些类,和引入的第三方jar包里面的类,都是由应用类加载器加载
* ④自定义加载器:
* 2. Class<?>[] interfaces:获取目标对象实现的所有的接口的class对象的数组
* 都是通过反射获取
* 3.InvocationHandler h:设置代理类中的抽象方法如何重写
*/
//1.获取当前这个类的类加载器,this直接表示当前类的对象
ClassLoader classLoader = this.getClass().getClassLoader();
//2.获取目标对象实现的所有的接口
//为什么获取实现的接口class对象的数组:因为从静态代理写到动态代理,静态代理说了保证目标对象跟代理对象实现的功能是一致的
Class<?>[] interfaces = target.getClass().getInterfaces();
/** 3.代理类中的抽象方法如何重写
* 表示代理类中的方法该如何执行(执行:调用目标对象的实现功能的过程)
*/
InvocationHandler h=new InvocationHandler() {