jdk动态代理技术demo(干货)
2016-07-27 14:19
549 查看
到博客上,以后有时间再详细讲解[/b]
通知接口
package com.me.aop; public interface IAdvice { void befor(); void after(); }
通知实现类,完成日志打印
package com.me.aop; public class LogAdvice implements IAdvice { @Override public void befor() { System.out.println("方法开始"); } @Override public void after() { System.out.println("方法结束"); } }
代理实现方式有多种,例如jdk、cglib...
package com.me.aop; public interface IProxyProvider { Object getProxyObj(); }
jdk实现
package com.me.aop; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JDKProxyImpl implements IProxyProvider { private IAdvice advice; private Object target; public JDKProxyImpl() { } public JDKProxyImpl(IAdvice IAdvice, Object target) { this.advice = IAdvice; this.target = target; } public IAdvice getAdvice() { return advice; } public void setAdvice(IAdvice advice) { this.advice = advice; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } @Override public Object getProxyObj() { Object obj = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(advice != null){ advice.befor(); } Object result = method.invoke(target, args); if(advice != null){ advice.after(); } return result; } }); return obj; } }
由于jdk动态代理要求代理的对象必须实现最少一个接口
package com.me.aop; public interface Caculator { int substrct(int a,int b); }
package com.me.aop; public class CaculaterImpl implements Caculator { @Override public int substrct(int a, int b) { System.out.println("方法执行中....."); return a-b; } }
客户端
package com.me.aop; public class Client { public static void main(String[] args) { //测试jdk动态代理 IAdvice logAdvice = new LogAdvice(); Caculator caculator = new CaculaterImpl(); IProxyProvider proxyProvider = new JDKProxyImpl(logAdvice,caculator); Caculator caculatorProxy = (Caculator) proxyProvider.getProxyObj(); System.out.println(caculatorProxy.substrct(3, 1)); } }
亲测可用!
相关文章推荐
- JDK动态代理VS CgLib
- Spring AOP动态代理-切面
- Ubuntu 安装 JDK 问题
- 动态代理的5模式使用示例和Mixin模式
- 详解java中动态代理实现机制
- jdk与jre的区别 很形象,很清晰,通俗易懂
- jdk中String类设计成final的原由
- java实现动态代理示例分享
- win7下安装 JDK 基本流程
- java使用动态代理来实现AOP(日志记录)的实例代码
- jdk环境变量配置
- java利用反射实现动态代理示例
- win2003 jsp运行环境架设心得(jdk+tomcat)
- windows linux jdk安装配置方法
- Java编程之jdk1.4,jdk1.5和jdk1.6的区别分析(经典)
- Java实现动态代理
- 十分钟理解Java中的动态代理
- 详解JDK 5 Annotation 注解之@Target的用法介绍
- Java远程过程调用基础:构建可自适应的动态代理对象的通用方法