模拟AOP
AOP(面向切面编程):不修改源代码,添加功能,减少耦合度。
模拟aop实现
1.添加日志功能,(动态代理方式实现)
关于动态代理的细节
1.需要一个被代理的对象
2.类加载器通常时和被代理对象使用相同的类加载器
3.一般地,Proxy.newProxyInstance()的返回值是一个被代理对象实现的接口的类型。
也可以是其他的接口类型。
注意:第二个参数,必须是一个接口类型的数组
提示:若代理对象不需要额外实现被代理对象实现的接口以外的接口,
*可以使用target.getClass().getInterfaces()
4.InvocationHandler通常使匿名内部类的方式:被代理对象需要是一个final类型
5.InvocationHandler的invoke()方法的第一个参数Object proxy指的是
正在被返回的那个代理对象,一般情况下不适用他。
package com.login.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogInterceptor {
//被代理对象
private Object target =null;
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public LogInterceptor(){
}
public void beforeMethod(){
System.out.println("save start...");
}
public Object getProxy(){
Object proxy= Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
beforeMethod();
method.invoke(target, args);
return null;
}
} );
//返回代理对象
return proxy;
}
}
2.Test
@Test
public void testProxy(){
UserDAO userdao = new UserDAOImpl();
LogInterceptor li = new LogInterceptor();
li.setTarget(userdao);
UserDAO proxy = (UserDAO) li.getProxy();
proxy.save();
}
创建userdao对象,再创建一个日志拦截器对象li,把被代理对象传给日志拦截器对象,返回一个代理对象proxy。proxy调用save方法。就会调用日志拦截器的beforeMethod方法。