阅读背景:

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

来源:互联网 

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;
	}

}
package org.sunjs.proxy.main



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: