Java进阶-代理

153 阅读1分钟

什么是代理模式

代理是一种常用的设计模式,其目的就是对其他对象提供一个代理以控制对某个对象的访问,代理类为委托类提供预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

静态代理

代理类和被代理类实现同一个接口

/**
 * 接口
 */
public interface Developer {
    void code();
}
/**
 * 被代理类
 */
public class JavaDeveloper implements Developer {
    @Override
    public void code() {
        System.out.println("我正在编写Java代码");
    }
}
/**
 * 代理类
 */
public class Mathine implements Developer {
    /**
    * 需要拥有被代理的真正实例
    */
    public Developer developer;

    public Mathine(Developer developer) {
        this.developer = developer;
    }

    @Override
    public void code() {
        developer.code();
    }
}
public class ProxyTest {
    public static void main(String[] args) {
        //通过静态代理实现JavaDeveloper进行code
        Developer developer = new JavaDeveloper();
        Mathine mathine = new Mathine(developer);
        //编写代码
        mathine.code();
    }
}

动态代理

动态代理分为两种Java JDK代理和cglib

JDK代理主要用到了InvocationHandler和Proxy类

InvocationHandler是一个接口,它的实现类可以认为是具体的代理实现

Proxy生成代理的具体操作类,可以为一个或多个接口动态的生成代理类

/**
 * 动态代理的执行类
 */
public class MathineCompany {

    /**
     * 被代理类
     */
    private Object proxyedObject;

    public MathineCompany(Object proxyedObject) {
        this.proxyedObject = proxyedObject;
    }

    public Object getProxyedObject() {
        Object o = Proxy.newProxyInstance(proxyedObject.getClass().getClassLoader(), proxyedObject.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                preProxyMethod();
                method.invoke(proxyedObject, args);
                postProxyMethod();
                return null;
            }
        });
        return o;
    }

    public void preProxyMethod() {
        System.out.println("执行代理前的方法");
    }

    public void postProxyMethod() {
        System.out.println("执行代理后的方法");
    }
}
public class ProxyTest {
    public static void main(String[] args) {
        //动态代理实现
        Developer developer1 = new JavaDeveloper();
        MathineCompany mathineCompany = new MathineCompany(developer1);
        Developer dev = (Developer) mathineCompany.getProxyedObject();
        dev.code();
    }
}