代理就是 A找B做事,C看到的是B在做事,看不到A;
我个人认为,就是加了一层。Java这边没有什么事情,是加一层结构解决不了的。
意义在于,B可以对A做的事情,进行拦截和加强,同时也可以记录日志等信息, 并且不用修改A的源代码,一个安全,一个扩展了。
Spring的AOP切面编程,其实就是这个原理。
静态代理:
对比现实生活的中介、婚介等等。
为什么叫静态代理:因为这个代理类是通过固定的代码定义的,不是由代码动态生成的类。
- 首先定义一个接口I
- A和B都去实现这个接口I
- 其中B是代理类,定义一个成员变量是A的对象
- B执行方法的同时,代用A对象来执行方法。
动态代理:
与静态代理相比,就是能动态生成。
- 首先定义一个工具类实现InvocationHandler
- 然后定义一个Object的成员变量
- 实现invoke方法
- 新建这个工具类对象,传入需要被代理的对象,然后执行invoke方法。
- 这个工具类会根据传入的不同对象,生成不同的代理类。(这个可能就是动态吧,我觉得就是加了一层。)
/**
* Author:ckvsok
* Date:2021/4/6
**/
package com.ckvsok.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//这个类用来自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口
private Object target;
public void setTarget(Rent rent) {
this.target = target;
}
//获取代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
}
//处理调用并返回结果 method是通过反射获取的原类的方法,args可以传入参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
seeHouse();
Object result = method.invoke(target, args);
fare();
return result;
}
//这个是中介的方法1,可以放在原类方法之前,或者之后执行。
public void seeHouse(){
System.out.println("中介带看房子");
}
//这个是中介的方法2
public void fare(){
System.out.println("收中介费");
}
}