给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy, 它是一种对象结构型模式,代理模式分为静态代理和动态代理。
动态代理:
举例:
创建一个Person接口
public interface Person { void doSomething(); }
创建一个实现类
public class Bob implements Person { public void doSomething() { System.out.println("Bob doing something!"); } }
创建JDK动态代理类,使其实现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) throws Throwable { // 被代理方法前执行 System.out.println("JDKDynamicProxy do something before!"); // 执行被代理的方法 Person result = (Person) method.invoke(target, args); // 被代理方法后执行 System.out.println("JDKDynamicProxy do something after!"); return result; } }
JDK动态代理测试类
public class JDKDynamicTest { public static void main(String[] args) { System.out.println("不使用代理类, 调用doSomething方法"); Person person = new Bob(); person.doSomething(); System.out.println("-------------------------------------- 分割线 --------------------------------------"); System.out.println("使用动态代理类, 调用doSomething方法"); //获取代理类 Person proxyPerson = new JDKDynamicProxy(new Bob()).getTarget(); // 调用doSomething方法 proxyPerson.doSomething(); } }
原文:https://www.cnblogs.com/brook0366/p/13762805.html