1、使用 JDK 动态代理,使用 Proxy 类里面的方法创建代理对象
(1)调用 newProxyInstance 方法
方法有三个参数:
第一参数,类加载器。
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口。
第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分。
2、编写 JDK 动态代理代码
(1)创建接口,定义方法
public interface UserDao {public int add(int a,int b);public String update(String id);}
(2)创建接口实现类,实现方法
public class UserDaoImpl implements UserDao {@Overridepublic int add(int a, int b) {return a+b;}@Overridepublic String update(String id) {return id;}}
(3)使用 Proxy 类创建接口代理对象
public class JDKProxy {public static void main(String[] args) {//创建接口实现类代理对象Class[] interfaces = {UserDao.class};// Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {// @Override// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// return null;// }// });UserDaoImpl userDao = new UserDaoImpl();UserDao dao =(UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));int result = dao.add(1, 2);System.out.println("result:"+result);} }
//创建代理对象代码class UserDaoProxy implements InvocationHandler {//1 把创建的是谁的代理对象,把谁传递过来//有参数构造传递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()+" :传递的参数..."+ Arrays.toString(args));//被增强的方法执行Object res = method.invoke(obj, args);//方法之后System.out.println("方法之后执行...."+obj);return res;}}
