首页 / 日志 / 使用动态代理解决方法调用前后添加日志信息
使用动态代理解决方法调用前后添加日志信息
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用动态代理解决方法调用前后添加日志信息,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1992字,纯文字阅读大概需要3分钟。
内容图文
![使用动态代理解决方法调用前后添加日志信息](/upload/InfoBanner/zyjiaocheng/1269/b29be1e58a4f46e192b859d3cf3eb844.jpg)
一般情况,在每个调用的方法中直接添加日志信息,存在如下问题:
1.代码混乱:越来越多的非业务需求加入(如日志和验证等)后,原有的业务方法急剧膨胀,每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点;
2.代码分散:以日志需求为例,只是为了满足这个单一的需求,就不得不在多个模块里多次重复相同的日志代码,如果日志需求发生变化,必须修改所有的模块。
针对以上问题,使用动态代理带解决。
代理设计模式的原理:使用一个代理将对象包装起来,然后用该代理取代原始对象。任何原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
1.先定义一个接口
public interface Calc { int add(int i,int j); int sub(int i,int j); int multi(int i,int j); int div(int i,int j); }
2.定义一个接口的实现类,如
public class CalcImpl implements Calc{ publicint add(int i, int j) { int result =i+j; return result; } publicint sub(int i, int j) { int result =i-j; return result; } publicint multi(int i, int j) { int result =i*j; return result; } publicint div(int i, int j) { int result =i/j; return result; } }
3.定义代理类
public class CalcLoggingProxy { // 要代理的对象 private Calc target; public CalcLoggingProxy(Calc target) { this.target=target; } public Calc getLoggingProxy(){ Calc proxy=null; //代理对象由哪一个类加载器加载 ClassLoader loader=target.getClass().getClassLoader(); //代理对象的类型,即其中有哪些方法 Class[] interfaces = new Class[]{Calc.class}; //当调用代理对象其中的方法试,就执行该方法 InvocationHandler h=new InvocationHandler() { /** * proxy:正在返回的代理对象,一般情况下很少使用 * method:正在调用的方法 * args:调用方法时,传入的参数 */public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("the method "+method.getName() +" begin with"+ Arrays.asList(args)); //执行target的方法,即执行代理对象的方法 Object result=method.invoke(target, args); System.out.println("the method "+method.getName() +" end with "+result); return result; } }; proxy=(Calc) Proxy.newProxyInstance(loader, interfaces, h); return proxy; } }
4.写个main方法测试效果
public static void main(String[] args) { Calc target =new CalcImpl(); Calc proxy =new CalcLoggingProxy(target).getLoggingProxy(); int result=proxy.add(1, 2); System.out.println("--->"+result); }
结果如下:
the method add begin with[1, 2]
the method add end with 3
--->3
用动态代理可以解决问题,但是用过spring的同学,肯定非常清楚spring中的AOP能轻松的解决此问题。
原文:http://www.cnblogs.com/sunshine2017/p/7353616.html
内容总结
以上是互联网集市为您收集整理的使用动态代理解决方法调用前后添加日志信息全部内容,希望文章能够帮你解决使用动态代理解决方法调用前后添加日志信息所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。