tomcat源码分析3—>代理模式深入分析
来源:互联网 发布:管理自己的淘宝店铺 编辑:程序博客网 时间:2024/05/22 12:35
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:元数据是描述对象的数据,所以可以通过元数据生成相应的对象)
阅读全文