代理模式之jdk动态代理

之前我们分享了一篇静态代理,今天分享一下我对动态代理的理解

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

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

静态代理有两种实现方式,同样动态代理也有两种,分别是通过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是如何实现动态代理的






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值