动态代理
在项目运行的时候才创建一个代理对象,对方法进行增强
即对在不改变原代码的情况下在原代码执行的前后增加逻辑
jdk中的Proxy类,前提:实现接口
Object Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h);
参数说明:
ClassLoader: 将代理类的.class文件加载到内存的类加载器;一般用被代理对象的类加载器
Class[]: 代理对象需要实现的接口,一般和被代理对象实现的接口一样
InvocationHandler: 执行处理类,在这里对方法进行加强,是一个接口,所有写参数时需要写入一个实现类,实现类需要实现该方法:
public Object invoke(Object proxy, Method method, Object[] args)
参数说明:
proxy:代理对象
method:当前执行的方法
args:当前方法执行的时候所需要的参数
返回值:就是当前method对象执行的返回值
举例:
Proxy.newProxyInstance(被代理对象.class.getClassLoader(), 被代理对象.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(被代理对象, args);;
}
});
动态代理的使用有两种
- jdk中Proxy类,前提:实现接口
- spring中cglib,前提:继承类
区别: Proxy至少实现一个接口,cglib至少继承一个类
声明:
有一些博文是看的黑马程序员视频,然后跟着老师做的笔记
Spring是跟子路老师学的
特此感谢,写这些文章的目的是为了自己方便查阅