java代理模式主要有JDK代理模式实现方式和CJLIB代理模式,我们通过代码认识代理模式
*
一、(JDK代理模式)
*
1、新建一个接口类
public interface Moveable {
public void move();
}
2、被代理类
public class Car implements Moveable {
@Override
public void move() {
try {
Thread.sleep(100);
System.out.println("车子开始移动!");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、代理类
public class ProxyHandle implements InvocationHandler {
private Object target;
public ProxyHandle(Object target) {
super();
this.target=target;
}
/**
* proxy : 被代理对象
* method:被代理方法
* args :被代理方法参数
*
* */
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
long start=System.currentTimeMillis();
method.invoke(target);
long end=System.currentTimeMillis();
System.out.println("移动时间:"+(end-start)+" 毫秒");
return null;
}
}
4、JDK动态代理
public class Test {
public static void main(String[] args) {
Car car=new Car();
ProxyHandle ph=new ProxyHandle(car);
Class c=car.getClass();
/**
* 参数:
* loader:
* interfaces:所有继承的接口
* h:代理类
* */
//Proxy.newProxyInstance(loader, interfaces, h)
//产生一个被代理对象
Moveable moveable= (Moveable) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), ph);
moveable.move();
}
}
二(CJLIB)
1、被代理类
public class Train {
public void move() {
System.out.println("火车行驶中。。。。");
}
}
2、代理类
public class CJLibProxy implements MethodInterceptor{
private Enhancer enhancer=new Enhancer();
public Object getProxy(Class clazz) {
//设置创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 拦截所有目标类方法的调用
*
* 参数:
* obj 目标累的实例
* method 目标方法的反射对象
* proxy 代理类的实例
*
* */
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("------日志准备开始------");
proxy.invokeSuper(obj, args);
System.out.println("------日志已经结束------");
return null;
}
}
3、CJLIB代理测试类
public class TestCJLib {
public static void main(String[] args) {
CJLibProxy proxy=new CJLibProxy();
Train train= (Train) proxy.getProxy(Train.class);
train.move();
}
}