代理模式(二):动态代理

代理模式(二):动态代理

/**
 * 抽象主题
 *
 * @Author: chenqi
 * @Date: 2019.9.24 10:13
 */
public interface Subject {
    void doSomething();
}
/**
 * 真相对象
 *
 * @Author: chenqi
 * @Date: 2019.9.24 10:13
 */
public class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("do something");
    }
}
/**
 * 增强的代码
 *
 * @Author: chenqi
 * @Date: 2019.9.24 10:14
 */
public class ProxyHandler implements InvocationHandler {
    private Object proxied;

    public ProxyHandler(Object proxied) {
        this.proxied = proxied;
    }

    /**
     * @param proxy  代理对象的引用
     * @param method 当前执行的方法
     * @param args   当前方法所需的参数
     * @return 和被代理对象的方法具有相同的返回值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before ...");
        Object o = method.invoke(proxied, args);
        System.out.println("after ...");
        return o;
    }
}
/**
 * 动态代理
 * 可以在程序运行期间根据需要动态的创建代理类及其实例来完成具体的功能
 *
 * @Author: chenqi
 * @Date: 2019.9.24 10:31
 */
public class Client {
    public static void main(String[] args) {
        // 创建真实对象
        Subject real = new RealSubject();
        // 创建真实对象的代理对象
        Subject proxySubject = (Subject) Proxy.newProxyInstance(
                // Subject.class.getClassLoader(),
                // new Class[]{Subject.class},
                real.getClass().getClassLoader(),
                real.getClass().getInterfaces(),
                new ProxyHandler(real));
        proxySubject.doSomething();
    }
}
Last modification:September 24th, 2019 at 07:08 pm

Leave a Comment