public interface UserDao { public int add(int a,int b); public String update(String id); }
1.创建这个接口的实现类,对将要增强的方法进行重写:
public class UserDaoImp implements UserDao { @Override public int add(int a, int b) { System.out.println("add方法执行"); return a+b; } @Override public String update(String id) { System.out.println("update方法执行"); return id; }
2.使用proxy创建接口代理对象
1.ClassLoader loader:用哪个类加载器去加载代理对象;
2.Class[] interfaces:这是一个Class型的数组:数组内容是需要代理类需要实现的接口
3.InvocationHandler:定义一个方法,内容是被增强后的方法
newProxy调用时也可以这样写更清楚:
//声明一个Class[]数组将需要实现的接口放到这个数组里边 Class[] interfaces={UserDao.class}; //创建一个接口的实现类 UserDaoImp userDaoImp=new UserDaoImp(); //使用newProxyInstance() UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDaoImp)); //可以新创建一个类,让这个类实现InvocationHandler接口, //得到这个类创建的对象之后,传入到newProxyInstance()中 class UserDaoProxy implements InvocationHandler{ //把创建的谁的代理对象,将那个类传过来: //有参数的构造传递: private Object obj; public UserDaoProxy(Object obj){ this.obj=obj; } @Override //写增强之后的逻辑: public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法之前进行处理: System.out.println(method.getName()+":方法之前执行。。。"+"传递的参数:"+ Arrays.toString(args)); //方法执行: Object res = method.invoke(obj, args); //方法之后处理: System.out.println("方法之后执行。。。"+obj); return res; } }
这样基本就是实现了JDK的动态代理。