A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

Java中的java.lang.reflec包下提供了Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成动态代理对象,JDK提供的代理只能针对接口做代理。

首先定义一个接口
  1. package com.kxg_05;

  2. public interface Student {
  3.         public void login();

  4.         public void regist();
  5. }
复制代码
然后创建一个该接口的实现类
  1. package com.kxg_05;

  2. public class StudentImpl implements Student {
  3.         public void login() {
  4.                 System.out.println("登录功能");
  5.         }

  6.         public void regist() {
  7.                 System.out.println("注册功能");
  8.         }
  9. }
复制代码
使用Proxy类中的public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)方法创建一个代理对象。

此方法中第一参数为要代理对象的构造器,第二个参数为该对象要实现的接口列表,第三个参数为
指派方法调用的调用处理程序。

第三个参数类型为
InvocationHandler接口,实际需要的是实现该接口的实现类。所以继续定义一个实现了InvocationHandler接口的实现类。
  1. package com.kxg_05;

  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;

  4. public class MyInvocationHandler implements InvocationHandler {

  5.         private Object target;// 目标对象

  6.         public MyInvocationHandler(Object target) {
  7.                 this.target = target;
  8.         }

  9.         @Override
  10.         public Object invoke(Object proxy, Method method, Object[] args)
  11.                         throws Throwable {
  12.                 // 第一个参数是需要进行代理的对象,第二个参数是对象的方法,第三个参数是对象方法的参数
  13.                 // 注意:该方法的调用是底层调用,看不到
  14.                 System.out.println("权限校验");
  15.                 Object result = method.invoke(target, args);
  16.                 System.out.println("日志记录");
  17.                 return result;// 返回的就是代理对象
  18.         }
  19. }
复制代码
得到此实现类以后,就可以创建新的代理对象
  1. package com.kxg_05;

  2. import java.lang.reflect.Proxy;

  3. public class Test {
  4.         public static void main(String[] args) {
  5.                 // Student接口的实现类
  6.                 Student s = new StudentImpl();

  7.                 // InvocationHandler接口的实现类
  8.                 MyInvocationHandler mi = new MyInvocationHandler(s);

  9.                 // 因为是对Student接口进行动态代理,所以返回值的类型也是Student接口
  10.                 Student proxy = (Student) Proxy.newProxyInstance(s.getClass()
  11.                                 .getClassLoader(), s.getClass().getInterfaces(), mi);

  12.                 // 调用方法
  13.                 proxy.login();
  14.                 proxy.regist();
  15.         }
  16. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马