您的位置:首页 > 编程语言 > Java开发

java动态代理对象实现日志的拦截(annotation自定义注解方式)

2016-04-02 22:50 916 查看
proxy动态代理的实现类

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);//执行查询方法

}

}


这个程序我已经打包上传了 和这个一模一样。 下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: