Java动态代理的实现

很多的开源框架底层都用了java动态代理的技术,所以想要看懂框架源码,这些基础的东西先要搞清楚。


类图:

141436_BqfH_817621.png

Interface和implement分别是我们原有的业务代码的接口和实现,现在我们想给原有代码加一些功能,而又不想动原有的逻辑。比如说加打印日志或者安全过滤功能。可以实现一个日志的代理对象或者安全代理对象,在所有用到原对象的地方都采用代理对象,就可以实现对原对象附加功能而不改变其内容的目的了。

举个具体例子:

假设原有代码  InterfaceA.java

public interface InterfaceA {
	public void sayHi();
}

以及他的实现类  A.java

public class A implements InterfaceA {
	@Override
	public void sayHi() {
		System.out.println("Hi");
	}
}

假如现在需要在这个sayHi方法之前打印日志。

新建LoggingInvocationHandler.java类实现打印日志的功能(虽然只是打印了Logging。。。。。。)

public class LoggingInvocationHandler implements InvocationHandler {

	private Object target;
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("Logging 。。。 。。。");
		return method.invoke(target, args);
	}

	public LoggingInvocationHandler setTarget(Object target) {
		this.target = target;
		return this;
	}
}

新建LogginProxy.java来创建代理类

public class LoggingProxy {
	public static Object getProxy(Object target){
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new LoggingInvocationHandler().setTarget(target));
	}
}

这个InvocationHandler和Proxy都是jdk为我们实现好了的可以方便我们创建代理。

测试代码:

public class Main {
	public static void main(String[] args) {
		InterfaceA a = (InterfaceA)LogProxy.getProxy(new A());
		a.sayHi();
	}
}

输出结果:

Logging:。。。 。。。

Hi

总结:Spring框架管理的Bean都是基于代理的,Mybatis插件、缓存功能也是动态代理实现的,理解动态代理有助于看懂这些框架的源代码,慢慢总结,继续努力!

转载于:https://my.oschina.net/yuanjifeng/blog/633663

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值