java动态代理记录

来源:互联网 发布:设备分布图制作软件 编辑:程序博客网 时间:2024/06/07 21:02

首先,上代码

BaseJDKProxy.java

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public abstract class BaseJDKProxy implements InvocationHandler{protected Object target;public BaseJDKProxy(Object target) {super();this.target = target;}@Overridepublic abstract Object invoke(Object proxy, Method method, Object[] args) throws Throwable;/** * 获取目标对象的代理对象 * @return 代理对象 */@SuppressWarnings("unchecked")public <T> T getProxy() {return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),target.getClass().getInterfaces(), this);}public void before(){System.out.println("方法执行前操作.......");}public void after(){System.out.println("方法执行后操作.......");}public void err(Exception e){// 获取抛出异常信息的代码行数System.out.println("调用类:" + Thread.currentThread().getStackTrace()[2].getFileName() + ",行数:" + Thread.currentThread().getStackTrace()[2].getLineNumber());System.out.println("方法执行异常,异常信息:" + e);}}

然后是JDKProxy.java

import java.lang.reflect.Method;public class JDKProxy extends BaseJDKProxy {public JDKProxy(Object target) {super(target);// TODO Auto-generated constructor stub}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {try{before();System.out.println("-------------------------------------------");// 获取代理的方法执行后的返回结果// 执行方法(此处不能直接写proxy,原因自己试试就知道了)Object result = method.invoke(target, args);System.out.println("该方法返回值为:" + result.toString() + "\n-------------------------------------------");after();return result;} catch (Exception e) {err(e);}return null;}}
其次就是代理类以及入口相关

public class JDKProxyTest {public static void main(String[] args) {LoginService login = new Login();JDKProxy proxy = new JDKProxy(login);LoginService loginProxy = proxy.getProxy();loginProxy.login();}}class Login implements LoginService{@Overridepublic void login() {System.out.println("登录成功");}}interface LoginService{void login();}

运行后输出日志如下:

运行输出:

方法执行前操作.......
-------------------------------------------
登录成功
调用类:JDKProxy.java,行数:24
方法执行异常,异常信息:java.lang.NullPointerException

修改代码为无异常代码输出:

方法执行前操作.......
-------------------------------------------
登录成功
该方法返回值为:方法无返回
-------------------------------------------
方法执行后操作.......

当然,判断方法是否有返回值之类的可以自行在method中寻找,提供了很多种方法,反射相关,这里不提及

以上便是JDK自带的动态代理实现方式,注意点是被代理的类必须实现了接口

当然,这只是给一个方法添加单个动态代理,下一篇再继续讲如何添加多个动态代理(非官方形式)



1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 中国留学生签证在美国被取消怎么办 建行卡网银帐号密码输入错误怎么办 建行卡密码忘了怎么办? 银行卡k宝丢了怎么办 k宝密码锁住了怎么办 农业银行k宝锁了怎么办 银行卡办的网银卡丢了怎么办 事业单位考察档案丢了怎么办 当兵政审家访家里没人在家怎么办 士兵转业结婚材料不全怎么办 体育生训练腿疼怎么办 车底盘刮的严重怎么办 新车底盘被刮了怎么办 车侧面刮凹了怎么办 憋气久了想呕吐怎么办 19岁网贷欠了3万怎么办 大学生欠2w网贷怎么办 当兵去了网贷怎么办 考公安视力不过关怎么办 身份证号和姓名电话泄露了怎么办 黑色裙子被染色了怎么办 戴墨镜鼻子太塌怎么办 戴墨镜鼻子有印怎么办 戴眼镜鼻梁塌了怎么办 站的时间长了腿疼怎么办 小孩腿筋拉伤了怎么办 走多了小腿骨疼怎么办 走多了一个腿疼怎么办 走太多路腿酸痛怎么办 老年人脚肿并痛怎么办 孩子蛙跳肌后大腿痛怎么办 走路久了腿酸怎么办 走路多了膝盖痛怎么办 走路多了小腿痛怎么办 走多了腿疼怎么办 小腿走多了酸痛怎么办 腿肚受凉了酸痛怎么办 晚上腿疼的睡不着觉怎么办 走路走多了腿酸怎么办 跳完蛙跳大腿疼怎么办 走路走多了脚疼怎么办