Loading

动态代理

Proxy

专门完成代理的操作类,是所有动态代理类的父类。通过此类为一 个或多个接口动态地生成实现类

newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)主要通过这个方法创建一个代理类,loader为类加载器,interfaces是被代理类的全部接口,h是Invocation实现类对象,用于处理方法执行逻辑

InvocationHandler

实现InvocationHandler接口它必须实现invoke方法,以完成代理的具体操作

public Object invoke(Object theProxy, Method method, Object[] params) throws Throwable,theProxy为代理类对象

动态代理案例
class ProxyFactory<T> implements InvocationHandler{
    private T target;
    public ProxyFactory(T target){
        this.target = target;
    }

    public static <B> Object getProxy(B target,Class<?>...interfaces){
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),interfaces,new ProxyFactory<B>(target));
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法之前打印");
        Object obj = method.invoke(target,args);
        System.out.println("方法之后打印");
        return obj;
    }
}
public static void main(String[] args) {
    SendService smsService = new SendService();
    MessageSend proxy = (MessageSend) ProxyFactory.getProxy(smsService,MessageSend.class);
    proxy.send();
}


/* 输出:
 * 方法之前打印
 * 正在发送消息
 * 方法之后打印
 */
posted @ 2022-04-14 21:35  7shuo  阅读(64)  评论(0)    收藏  举报