代理模式

被代理得接口和实现类

public interface TestService {
    public void print();
}


public class TestServiceImpl implements TestService{
    @Override
    public void print() {
        System.out.println("打印实现类信息");
    }
}


代理类

//顺便说下为什么要继承InvocationHandler接口呢?
/*因为代理类的实例在调用实现类的方法的时候,不会调真正的实现类的这个方法,
而是转而调用这个类的invoke方法(继承时必须实现的方法),
在这个方法中你可以调用真正的实现类的这个方法。
*/
public class ProxyHandler implements InvocationHandler {
    // 持有被代理对象的引用(此引用可以有外部灵活制定的)
    private Object target;
     
    public ProxyHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
        System.out.println("代理类开始");
        method.invoke(target, args);
        System.out.println("代理类结束");
        return null;
    }
}


main方法

public class TestMain {
    public static void main(String[] args) {
        TestService test = new TestServiceImpl();
        //创建代理处理器
        ProxyHandler proxyHandler = new ProxyHandler(test);
        //创建代理类
        TestService testProxy = (TestService) Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), proxyHandler);
        testProxy.print();
    }
}

结果

代理类开始
打印实现类信息
代理类结束


{context}