1. 使用JDK动态代理,
调用如下方法
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException
方法有三个参数loader - 定义代理类的类加载器interfaces - 代理类要实现的接口列表h - 指派方法调用的调用处理程序
2、编写代码
1、创建一个接口
package com.daijunyi.dao;public interface UserDao {public int add(int a,int b);public String update(String id);}
2、创建一个接口实现类
package com.daijunyi.dao;public class UserDaoImp implements UserDao {@Overridepublic int add(int a, int b) {return a+b;}@Overridepublic String update(String id) {return id;}}
3、写代理
package com.daijunyi.test;import com.daijunyi.dao.UserDao;import com.daijunyi.dao.UserDaoImp;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class JDKProxy {public static void main(String[] args) {Class[] interfaces = {UserDao.class};UserDaoImp userDaoImp = new UserDaoImp();UserDaoProxy userDaoProxy = new UserDaoProxy(userDaoImp);UserDao userDao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, userDaoProxy);userDao.add(1,2);userDao.update("11");}}class UserDaoProxy implements InvocationHandler{private Object obj;public UserDaoProxy(Object obj) {this.obj = obj;}//增强的逻辑@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法之前System.out.println("方法之前执行:"+method.getName()+":传递参数:"+args.toString());//原来方法执行System.out.println("原来方法执行:"+method.getName()+":传递参数:"+args.toString());Object invoke = method.invoke(this.obj, args);//方法之后System.out.println("方法之后执行:"+method.getName()+":传递参数:"+args.toString());return invoke;}}
