JDK动态代理
代理模式( Proxy Pattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做 Proxy,它是一种对象结构型模式,代理模式分为静态代理和动态代理,我们来介绍动态代
举例
(1)创建一个抽象类, Person接口,使其拥有一个没有返回值的 doSomething方法。
/*** 抽象类人*/public interface Person {void doSomething();}
(2)创建一个名为Bob的 Person接口的实现类,使其实现 dosomething方法
/***创建一个名为Bob的人的实现类*/public class Bob implements Person {public void doSomething() {System.out.println("Bob doing something!");}}
(3)创建DK动态代理类,使其实现 InvocationHandler接口。拥有一个名为 target的变量,并创建getTarget获取代理对象方法
/*** JDK动态代理* 需要实现InvocationHandler接口*/public class JDKDynamicProxy implements InvocationHandler {// 被代理对象Person target;// JDKDynamicProxy构造函数public JDKDynamicProxy(Person person) {this.target = person;}// 获取代理对象public Person getTarget() {return (Person)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}// 动态代理invoke方法public Person invoke(Object proxy, Method method, Object[] args) throwsThrowable {// 被代理方法前执行System.out.println("JDKDynamicProxy do something before!");// 执行被代理的方法Person result = (Person) method.invoke(target, args);// 被代理的方法后执行System.out.println("JDKDynamicProxy do something after!");return result;}}
创建JDK动态代理测试类 JDKDynamicTest
/*** JDK动态代理测试*/public class JDKDynamicTest {public static void main(String[] args) {System.out.println("不是用代理了类,调用doSomething方法");// 不是用代理类Person person = new Bob();// 调用doSomething方法person.doSomething();System.out.println("-------------------------------------- 分割线-------------------------------------");System.out.println("使用代理类,调用doSomething方法");// 获取代理类Person proxyPerson = new JDKDynamicProxy(new Bob()).getTarget();// 调用doSomething方法proxyPerson.doSomething();}}
