Jdk动态代理类的‘源’代码猜想

来源:互联网 发布:mac电脑怎样退出程序 编辑:程序博客网 时间:2024/06/08 00:49

Dog.java:

public interface Dog{// info方法声明void info();// run方法声明void run();}

DogUtil.java

public class DogUtil{// 第一个拦截器方法public void method1(){System.out.println("=====模拟第一个通用方法=====");}// 第二个拦截器方法public void method2(){System.out.println("=====模拟通用方法二=====");}}

MyInvakationHander.java

public class MyInvokationHandler implements InvocationHandler{// 需要被代理的对象private Object target;public void setTarget(Object target){this.target = target;}// 执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法public Object invoke(Object proxy, Method method, Object[] args)throws Exception{DogUtil du = new DogUtil();// 执行DogUtil对象中的method1。du.method1();// 以target作为主调来执行method方法Object result = method.invoke(target , args);// 执行DogUtil对象中的method2。du.method2();return result;}}

MyProxyFacory.java

public class MyProxyFactory{// 为指定target生成动态代理对象public static Object getProxy(Object target)throws Exception{// 创建一个MyInvokationHandler对象MyInvokationHandler handler = new MyInvokationHandler();// 为MyInvokationHandler设置target对象handler.setTarget(target);// 创建、并返回一个动态代理return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces() , handler);}}

Test.java

public class Test{public static void main(String[] args) throws Exception{// 创建一个原始的GunDog对象,作为targetDog target = new GunDog();// 以指定的target来创建动态代理Dog dog = (Dog)MyProxyFactory.getProxy(target);dog.info();dog.run();}}

当调用dog.info()的时候会调用到hander.invoke()方法中,再借鉴到struts2中的代理对象的实现,我觉得可能生成的动态代理DogProxy类的源代码可能是这样的:

DogProxy.java

class DogProxy { InvcationHandler handler;public setHandler( InvcationHandler handler) {   this.handler = handler;}public  info() {  handler.invoke();}public  run() {  handler.invoke();}}


原创粉丝点击