您的位置:首页 > 运维架构 > Tomcat

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

2017-12-26 11:07 363 查看
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:元数据是描述对象的数据,所以可以通过元数据生成相应的对象)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息