什么是代理?
举个简单的小例子。某包租婆要出租房子,但她并不想自己干这活,于是她就可以找一个帮干活的人,这个人就是我们所说的代理。
那什么是静态代理?什么又是动态代理呢?*
**
那么我们先来说说静态代理吧
首先建一个接口:代表要干出租房屋这件事情
接口:
public interface Rent {
public void rent();
}
再建一个房东类这个类继承Rent接口:代表房东要干出租房屋这件事情。
但是房东就不想干破事,于是就找个人来帮她,这个时候代理就出现了,所以我们要再建立一个代理类这个代理类干的也是出租房屋这件事情,所以也要继承Rent接口
房东类
public class Host implements Rent {
public void rent() {
System.out.println("房东要出租房子");
}
}
代理类:
这里注意了:代理类中有Proxy这个带参构造给它传入的是一个房东对象,可以理解为帮哪一个房东干活,代理对象还可以提供其他服务,例如:带看房、带签合同
public class Proxy implements Rent{
private Host host;
public Proxy(Host host){
this.host=host;
}
public void rent() {
host.rent();
seeHome();
qianHome();
}
public void seeHome(){
System.out.println("中介带看房");
}
public void qianHome(){
System.out.println("中介带签合同");
}
}
Test
public static void main(String[] args) {
Host host=new Host();
Proxy proxy = new Proxy(host);
proxy.rent();
}
运行结果
房东要出租房子
中介带看房
中介带签合同
这就是静态代理,是不是还是不太明白为什么是静态代理?在这里我们不难发现,这个代理对象是由我们手动创建的,所以它是静态代理,还是不明白的话看看接下来的动态代理,这样会跟好区分他们的区别。
动态代理
接下来讲讲动态代理吧,动态代理也叫JDK代理、接口代理。所谓动态代理就是代理对象自动创建,是利用JDK中API动态的在内存中构建对象。这里我们也以租房子为例。
在这里我们同样的创建接口(要干的事情),还有要干事情的房东同上,接下来就是动态代理的自动创建创建。
在创建之前来讲讲JDK中的API吧
InvocationHandler:是一个接口里面只有一个invoke方法,是用来处理代理实例上的方法调用并返回结果。 当在与之关联的代理实例上调用方法时,将在调用处理程序中调用此方法。
参数:proxy - 调用该方法的代理实例
method :所述方法对应于调用代理实例上的接口方法的实例。
args :包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。
Proxy:提供了创建动态代理类和实例的静态方法newProxyInstance通过该方法可以自动生成代理类
newProxyInstance:
参数: 1、加载类的位置
2、要加载的接口
3、调度方法调用的调用处理函数
那么就介绍完了API中要用到的类和方法了,接下来上代码:
public class ProxyInvocationHandle implements InvocationHandler {
private Rent reat;
public void setRent(Rent reat){
this.reat=reat;
}
//得到生成代理类
public Object getProxy(){
//getClassLoader()加载类的位置
//reat.getClass().getInterfaces()表示要代理的接口
return Proxy.newProxyInstance(this.getClass().getClassLoader(),reat.getClass().getInterfaces(),this);
}
//生成代理类,处理代理实例,返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质就是使用反射
seeHome();
Object invoke = method.invoke(reat, args);
qianHome();
return invoke;
}
public void seeHome(){
System.out.println("中介带看房");
}
public void qianHome(){
System.out.println("中介带签合同");
}
}
Test
不懂的小伙伴记得看注释哦
public static void main(String[] args) {
Host host=new Host();
ProxyInvocationHandle proxyInvocationHandle = new ProxyInvocationHandle();
//得到代理对象
proxyInvocationHandle.setRent(host);
//创建代理类
Rent proxy = (Rent) proxyInvocationHandle.getProxy();
//用代理类调用被代理对象中的方法
proxy.rent();
}
运行结果
中介带看房
房东要出租房子
中介带签合同