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

11 篇文章 0 订阅
7 篇文章 0 订阅

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

}


这个程序我已经打包上传了  和这个一模一样。  下载地址

版权属于: 技术客
官方地址: http://www.sunjs.com 
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值