aop jdk动态代理
-
使用jdk 动态代理,使用Proxy类中的方法 创建代理对象
//这个方法 是 Proxy类 中的方法 public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException
- 方法中含有三个参数
- 第一个 类加载器
- 第二个 增强方法所在的类 这个类实现的接口 支持多个接口
- 第三个 实现这个接口 InvocationHandler 创建代理对象
- 方法中含有三个参数
-
jdk 动态代理代码
-
创建接口 定义方法
package com.zh.demo1; public interface UserDao { public int add(int a,int b); public String update(String id); }
-
-
创建接口的实现类 实现方法
package com.zh.demo1; public class UserDaoImpl implements UserDao{ @Override public int add(int a, int b) { return a+b; } @Override public String update(String id) { return id; } }
-
使用Proxy类创建接口代理对象
- 创建一个类 创建main方法
- 实现Proxy中newProxyInstance 方法 方法含有三个参数 上边写了 第一个参数是类的加载器 为JDKProxy.class.getClassLoader() 第二个参数为增强方法所在的类 举例为userdao 第三个参数一个接口用来创建代理对象 两种方法 1 匿名内部类 直接new 2 创建一个新的类实现此接口 我采用的为此方法
public class JDKProxy {
private Object object;
public static void main(String[] args) {
//创建接口实现类的代理对象
Class[] interfaces={UserDao.class};
UserDaoImpl userDao=new UserDaoImpl();
UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),
interfaces,
new UserDaoProxy(userDao));
int add=dao.add(1,2);
System.out.println(add);
}
}
//实现这个接口需要实现一个方法 invoke 表示增强的逻辑
class UserDaoProxy implements InvocationHandler{
//1 把创建的是 谁的代理对象 把谁传递过来
//通过有参构造进行传递 对应上边
private Object object;
public UserDaoProxy(Object object){
this.object=object;
}
//增强的逻辑
@Override
//第一个参数 代理对象 第二个值 表示当前的方法 第三个 表示方法的参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前 原方法执行前可以加入
//method.getName()执行的方法名字
System.out.println("方法之前执行"+method.getName()+":传递的参数====="+ Arrays.toString(args));
//被增强的方法
//下面表示执行当前方法
Object a=method.invoke(object,args);
//方法之后 原方法执行后可以加入
System.out.println("方法之后执行 "+object);
return a;
}
}