您的位置:首页 > 编程语言 > Java开发

代理模式之jdk动态代理

2017-07-29 23:01 267 查看
之前我们分享了一篇静态代理,今天分享一下我对动态代理的理解

=====相关链接====

想了解静态代理的同学请点击幽暗城传送门

静态代理有两种实现方式,同样动态代理也有两种,分别是通过jdk和cglib来实现,下面我们分别来说下两者的实现方式

jdk代理:只能代理实现了接口的类,没有实现接口的类不能实现动态代理,看下面代码

行驶时间代理类

public class TimeHandler implements InvocationHandler {

public TimeHandler(Object target){
super();
this.target = target;
}

private Object target;

/**
* auth wangsongyan
* @param proxy 被代理对象
* @param method 被代理对象的方法
* @param args 方法的参数
* @return Object 方法的返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long starttime = System.currentTimeMillis();
System.out.println("汽车开始行驶");
method.invoke(target);
long endtime = System.currentTimeMillis();
System.out.println("汽车结束行驶,行驶时间:" + (endtime - starttime ) +"毫秒");
return null;
}

}
日志代理类

public class LogHandler implements InvocationHandler {

public LogHandler(Object target) {
super();
this.target = target;
}

private Object target;

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("发信息给老婆说正在开车");
method.invoke(target);
System.out.println("发信息告诉老婆到家了下车了");
return null;
}

}

Moveable类

public interface Moveable {

void move();

void stop();
}


测试类

public class Test {

public static void main(String[] args) {
Car car = new Car();
InvocationHandler timeHandler = new TimeHandler(car);
Class<?> cls = car.getClass();
/**
* loader 类加载器
* interfaces 实现接口
* h InvocationHandler
*/
Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), timeHandler);
LogHandler logHandler = new LogHandler(m);
Moveable m1 = (Moveable)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), logHandler);
m1.move();
}
}
我们这里用的是jdk的Proxy类实现的,这里要求的是代理类必须都实现同一接口,由于cglib动态代理东西比较多,所以不在这篇分享中写出,后面会继续分享cglib是如何实现动态代理的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: