java动态代理对象实现日志的拦截(annotation自定义注解方式)
2016-04-02 22:50
916 查看
proxy动态代理的实现类
自己定义的一个Logger输出日志信息类
自定义annotation,注解使用
接口IUserDao
实现类UserDaoImpl
测试主类main函数
这个程序我已经打包上传了 和这个一模一样。 下载地址
package org.sunjs.proxy.main; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.sunjs.proxy.annotation.LogAnnotation; import org.sunjs.proxy.utils.Logger; /** * 代理类 * 这里必须实现InvocationHandler接口 */ public class LogProxy implements InvocationHandler { private LogProxy() { // 不让外部调用 } private Object target; // 这里的参数o就是要代理的对象 public static Object getInstance(Object o) { LogProxy pm = new LogProxy(); pm.target = o;// 赋值,设置这个代理对象 // 通过Proxy的方法创建代理对象,第一个参数是要代理对象的ClassLoader装载器 // 第二个参数是要代理对象实现的所有接口 // 第三个参数是实现了InvocationHandler接口的对象 // 此时的result就是一个代理对象,代理的是o Object result = Proxy.newProxyInstance(o.getClass().getClassLoader(), o .getClass().getInterfaces(), pm); return result; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //如果下边不判断方法名的话,就会拦截到被代理对象的所有方法的执行。 // if(method.getName().equalsIgnoreCase("add")){ // //输入日志 // Logger.info("动态代理日志信息."); // } //2.自己定义一个annotation的类(LogAnnotation),进行注解拦截。 if(method.isAnnotationPresent(LogAnnotation.class)){ LogAnnotation la = method.getAnnotation(LogAnnotation.class); Logger.info(la.value()+"--->执行的是"+method.getName()+"方法."); } Object obj = method.invoke(target, args); return obj; } }
自己定义的一个Logger输出日志信息类
package org.sunjs.proxy.utils; import java.util.Date; /** * 输出日志 */ public class Logger { public static void info(String message){ System.out.println(new Date()+"--------->"+message); } }
自定义annotation,注解使用
package org.sunjs.proxy.annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * 自定义一个annotation */ @Retention(RetentionPolicy.RUNTIME) public @interface LogAnnotation { public String value() default ""; }
接口IUserDao
package org.sunjs.proxy.dao; import org.sunjs.proxy.annotation.LogAnnotation; /** * 接口 */ public interface IUserDao { @LogAnnotation("annotation注解日志信息") public void delete(Integer id); // @LogAnnotation("test") public Object load(Integer id); }
实现类UserDaoImpl
package org.sunjs.proxy.dao; /** * 仿数据库dao操作类 */ public class UserDaoImpl implements IUserDao { @Override public void delete(Integer id) { System.out.println("执行类数据库删除操作成功!"); } @Override public Object load(Integer id) { System.out.println("从数据库查询了id为["+id+"]的数据信息!"); return null; } }
测试主类main函数
package org.sunjs.proxy.main; import org.sunjs.proxy.dao.IUserDao; import org.sunjs.proxy.dao.UserDaoImpl; /** * 测试类 */ public class Main { public static void main(String[] args) { IUserDao userDao = new UserDaoImpl(); //创建的动态代理. IUserDao log = (IUserDao)LogProxy.getInstance(userDao); //具体哪个会输出日志信息,请看我在接口IUserDao上的annotation注解即可。 //对于LogProxy这个类的写法还需要好好研究研究 log.delete(1);//执行删除方法 log.load(1);//执行查询方法 } }
这个程序我已经打包上传了 和这个一模一样。 下载地址
相关文章推荐
- Maven+SpringMVC+Mybatis 开发环境整合
- Struts的Action中获取Request和response对象
- SpringMVC返回json数据的三种方式
- Java的异常
- 是时候复习一下Java基础了(一)
- ubuntu下JDK的安装
- Java 的多态
- 【java集合框架源码剖析系列】java源码剖析之HashMap
- 【java集合框架源码剖析系列】java源码剖析之HashMap
- java 运用表达式计算贷款金额
- 我理解的--java观察者模式
- java线程同步问题——由腾讯笔试题引发的风波
- JAVA实现LDAP连接验证
- 如何安装配置gradle及eclipse的结合
- java jdbc如何使用
- JavaWeb基础---Java序列化
- Arcgis+ArcEngine+Java开发软件安装配置问题
- Java_Ant详解
- Spring
- 【java】eclipse windowbuilder可视化设计界面