tomcat源码分析3—>代理模式深入分析

14 篇文章 0 订阅
5 篇文章 0 订阅

java动态代理:

hello接口

public interface Hello {

    void sayHello();
}

HelloImp实现

public class HelloImp implements Hello {
    public void sayHello() {
        System.out.println("你好,世界!");
    }
}
public class MDynamicProxy implements InvocationHandler {

    private Object target;

    public MDynamicProxy(Object target){
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        beforeInvoke();
        Object result = method.invoke(target, args);
        afterInvoke();
        return result;
    }

    private void beforeInvoke(){
        System.out.println("方法执行之前");
    }

    private void afterInvoke(){
        System.out.println("方法执行之后");
    }
}
@Test
    public void test1(){
        // 需求代理的类
        Hello hello = new HelloImp();
        // 方法拦截器
        MDynamicProxy dynamicProxy = new MDynamicProxy(hello);
        /**
         * 包含了方法拦截器的代理
         * 该代理类的所有的可执行的方法都会被dynamicProxy拦截
         * 所以dynamicProxy《拦截了所有的方法》之后,再根据《方法名》
         * 去找到被代理类的相应的方法名,并执行响应的方法
         */
        Hello helloProxy = (Hello) Proxy.newProxyInstance(
                hello.getClass().getClassLoader(),
                hello.getClass().getInterfaces(),
                dynamicProxy
                );
        System.out.print("代理之前:");
        hello.sayHello();
        System.out.print("代理之后:");
        helloProxy.sayHello();
  }

通过查看Proxy源码可以知道,proxy通过newProxyInstance生成代理类:1、该类包含了接口所有的方法;2、该类所有的方法调用会被分发到dynamicProxy类上(Method是被调用的方法信息的封装);3、method.invoke(target, args)会在被代理类上寻找是否有该方法的信息,如果有那么就调用。

上述是动态代理的核心要点

总结:Method、Class这些是描述对象的对象,是属于“元”素据,代理通过对对象的元数据在运行时进行查找分析等实现了Java的反射机制和动态代理(PS:元数据是描述对象的数据,所以可以通过元数据生成相应的对象)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值