log日志的java动态代理

       问题描述:今天老大告诉我说系统的Log日志要修改,有些参数不能打印,有些参数不能打印,有些参数要替换部分内容,要求系统要尽量小的修改。我修改了一天,现记录如下。

思路:

       思路一. 定义方法,传入要打印参数和要替换的参数

       思路二. 用注解或aop的方式实现,在对象的属性上加自定义注解,通过解析此注解,替换属性内容来达到目的

       思路三. jdk的动态代理,代理log日志来实现

解析:

       思路一可以实现,也能达到想要的效果,但是代码改动量太大。每个log日志处都要调用此方法,对于其他人来说代码的可读性不高,开销太大。

       思路二通过注解加aop的方式,如果参数不是写在对象中的,则不能话则不能解决问题,而且在log.info中,无法得到对象中的内容

       思路三是别人提醒我的,此方法为log日志实现代理,每个需要打印日志的类中,只要替换日志即可

实现:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @description 日志代理类.
 * @author Silencer
 * @date 2018-11-13 21:55:23
 * @version v_1.0
 */
public class LoggerProxy implements InvocationHandler {
	
	private Logger logger;
	
	public LoggerProxy(Class clazz) {
		logger = LoggerFactory.getLogger(clazz);
	}

	public static Logger getLogger(Class clazz) {
		LoggerProxy proxy = new LoggerProxy(clazz);
		return (Logger) Proxy.newProxyInstance(proxy.getClass().getClassLoader(), proxy.logger.getClass().getInterfaces(), proxy);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("操作前!");
		Object invoke = method.invoke(logger, args);
		System.out.println("操作后!");
		return invoke;
	}
	
}

 

你可能感兴趣的:(web)