最近看到这个词比较多,回顾了下java中的代理技术,他是jdk1,3之后增加的特性.
主要是一种思想.如果A具有某些行为在编译时无法确定,那么让B代替A在运行时执行.A的行为,因为此时A的行为是确定的.
代理是为了解决编译时无法确定具体实现的问题,利用代理可以在运行时创建一组实现了接口的新类,来对之前的实现进行修改操作.
这样有些抽象,下面是一个例子
首先定义一个接口,他封装了一个演员类会具有的一部分行为.
package com.tong.xu.proxy.dao;
public interface Actress {
public String plan();
public String foundChance();
public String sigingContract();
}
然后一个演员肯定是具有这些行为的
package com.tong.xu.proxy.imp;
import com.tong.xu.proxy.dao.Actress;
public class Actor implements Actress {
@Override
public String plan() {
return "安排计划";
}
@Override
public String foundChance() {
return "寻找机会";
}
@Override
public String sigingContract() {
return "签合同";
}
}
然而我们知道实际上演员会有代理人来替他们做一些事情.那么代理需要符合什么条件呢?他要能够根据需要代理的不同的事情来做出不同的行为以达到目的.
package com.tong.xu.proxy.imp;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Agent1 implements InvocationHandler {
Actor actor = new Actor();
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String result = null;
String methodName = method.getName();
if(methodName.equals("plan")){
result = "替演员"+method.invoke(actor,args);
}else if(methodName.equals("foundChance")){
result = "帮助演员"+method.invoke(actor,args);
}else{
result = "安排演员"+method.invoke(actor,args);
}
return result;
}
}
那么对演员来说,需要有人对他们需要做的事情进行分担,代理他们完成一些行为,所以他实际上是需要一个可以完成这部分行为的对象
@Test
public void testProxy(){
Actress actress = (Actress) Proxy.newProxyInstance(this.getClass().getClassLoader(),new Class[]{Actress.class},new Agent1());
System.out.println(actress.plan());
System.out.println(actress.foundChance());
System.out.println(actress.sigingContract());
}
总结:
实现动态代理需要两点
1.代理类 实现InvocationHandler接口,并重写invoke方法:这里实际上是使用了反射来获取执行方法的属性
2,使用Proxy类方法newProxyInstance创建一个代理对象,这个方法有三个参数:类加载器,封装了要实现方法的类数组,实现了invocationHandler借口的代理类型对象