一、底层实现原理(JDK动态代理)
AOP的底层实践是使用了java.lang.reflect.Proxy
的newProxyInstance
方法
有三个参数:
- loader:class 加载器,你在某个类下使用Proxy.newProxyInstance,就使用该类的class加载器。
- interfaces:接口数组
- h :invocationHandler 即增强方法的处理方式
根据这几个参数,我们开始编写我们的代码。首先是接口,代码如下
public interface UserDao {
public int add(int a, int b);
}
下面是接口的实现类
public class UserDaoImpl implements UserDao {
@Override
public int add(int a, int b) {
System.out.println("add 方法执行了");
return a+b;
}
}
接下来编写我们的主函数。主函数中,我们所调用的类,是由Proxy.newProxyInstance
转换而来的的UserDao接口类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Class[] interfaces = {
UserDao.class};
UserDaoImpl userDaoImpl = new UserDaoImpl();
//创建接口实现类代理对象
//此处用UserDao作为返回值的类型,是因为我们传入的interfaces就是UserDao.class
UserDao dao = (UserDao) Proxy.newProxyInstance(Main.class.getClassLoader(), interfaces, new InvocationHandler() {
//把想要代理的对象传递进来
private Object object = userDaoImpl;
//增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前
System.out.println("方法之前执行 : " + method.getName() + "; 传递的参数:" + Arrays.toString(args) + "; object:" + object);
//被增强的方法执行,填写要增强的对象、参数
Object res = method.invoke(object, args);
//方法之后
System.out.println("方法之后执行 : " + method.getName() + "; 传递的参数:" + Arrays.toString(args) + "; object:" + object);
return res;
}
});
int res = dao.add(1, 2);
System.out.println("这个是res: " + res)