JDK动态代理

代理模式( Proxy Pattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做 Proxy,它是一种对象结构型模式,代理模式分为静态代理和动态代理,我们来介绍动态代

举例

(1)创建一个抽象类, Person接口,使其拥有一个没有返回值的 doSomething方法。

  1. /**
  2. * 抽象类人
  3. */
  4. public interface Person {
  5. void doSomething();
  6. }

(2)创建一个名为Bob的 Person接口的实现类,使其实现 dosomething方法

  1. /**
  2. *创建一个名为Bob的人的实现类
  3. */
  4. public class Bob implements Person {
  5. public void doSomething() {
  6. System.out.println("Bob doing something!");
  7. }
  8. }

(3)创建DK动态代理类,使其实现 InvocationHandler接口。拥有一个名为 target的变量,并创建getTarget获取代理对象方法

  1. /**
  2. * JDK动态代理
  3. * 需要实现InvocationHandler接口
  4. */
  5. public class JDKDynamicProxy implements InvocationHandler {
  6. // 被代理对象
  7. Person target;
  8. // JDKDynamicProxy构造函数
  9. public JDKDynamicProxy(Person person) {
  10. this.target = person;
  11. }
  12. // 获取代理对象
  13. public Person getTarget() {
  14. return (Person)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
  15. }
  16. // 动态代理invoke方法
  17. public Person invoke(Object proxy, Method method, Object[] args) throws
  18. Throwable {
  19. // 被代理方法前执行
  20. System.out.println("JDKDynamicProxy do something before!");
  21. // 执行被代理的方法
  22. Person result = (Person) method.invoke(target, args);
  23. // 被代理的方法后执行
  24. System.out.println("JDKDynamicProxy do something after!");
  25. return result;
  26. }
  27. }

创建JDK动态代理测试类 JDKDynamicTest

  1. /**
  2. * JDK动态代理测试
  3. */
  4. public class JDKDynamicTest {
  5. public static void main(String[] args) {
  6. System.out.println("不是用代理了类,调用doSomething方法");
  7. // 不是用代理类
  8. Person person = new Bob();
  9. // 调用doSomething方法
  10. person.doSomething();
  11. System.out.println("-------------------------------------- 分割线-------------------------------------");
  12. System.out.println("使用代理类,调用doSomething方法");
  13. // 获取代理类
  14. Person proxyPerson = new JDKDynamicProxy(new Bob()).getTarget();
  15. // 调用doSomething方法
  16. proxyPerson.doSomething();
  17. }
  18. }