一个典型的动态代理可分为以下四个步骤:
1.创建抽象角色
2.创建真实角色
3.通过实现InvocationHandler接口创建中介类
4.通过场景类,动态生成代理类
package proxy.test;
//抽象角色
public interface Icode {
void doSomething(String name);
}
package proxy.test;
//真实角色
public class JavaCode implements Icode{
private String jname;
public JavaCode(String jname){
this.jname = jname;
}
@Override
public void doSomething(String name) {
System.out.println(jname+" implemented name "+name+" in JavaCode!");
}
}
//动态代理类(一个位于代理类与委托类之间的中介类),需要实现InvocationHandler接口
public class CoderDynamicProxy implements InvocationHandler{
//被代理的实例
private Icode code;
public CoderDynamicProxy(Icode code){
this.code = code;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前:"+System.currentTimeMillis());
Object result = method.invoke(code, args);
System.out.println("代理后:"+System.currentTimeMillis());
return result;
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class DynamicProxyTest {
public static void main(String[] args) {
//要代理的真实的对象
Icode code = new JavaCode("张三_java");
//创建代理类实例
InvocationHandler hander = new CoderDynamicProxy(code);
//获取类加载器
ClassLoader cl= Icode.class.getClassLoader();
//动态产生一个代理类
Icode proxy = (Icode) Proxy.newProxyInstance(cl,code.getClass().getInterfaces(),hander);
//通过代理类执行Javacode具体实现的doSomething()方法
proxy.doSomething("update project");
}
}