Java的动态代理机制

       第一篇blog文章,自己是个菜鸟,希望大家能有指出文章中的错误,大家一起进步。

 

上图是代理模式的实现,代理模式主要是用于客户端对真实对象访问之前进行一些控制,例如日志输出,权限控制等,如上图,客户程序只能通过SubjectProxy来访问RealSubject,因为代理类和实现类都是实现一个同一个Subject接口,所以在客户程序看来,他只知道访问的是实现Subject接口的一个对象,而不管是哪个类的对象,代理类持有被代理对象的引用,在调用方法时,代理对象可以先做一些操作,然后再调用被代理对象的方法。但是这样做的缺点是,一个Subject就要创建一个代理类,如果Subject很多,那么就需要为每个Subject都创建一个代理类,类的数量就会变得很庞大,更重要的是,如果要修改代理功能,比如原来是没有日志输出的,现在要加上日志输出,哪么你需要在每个代理类中添加日志输出的代码,(不过要是权限控制的话,这样的静态代理是不是能实现更细粒度的权限控制?比如我对这个对象的方法可以让所有人访问,而其他一个对象需要有某某权限才能访问。如果在动态代理下,也可以实现对每个对象的细粒度控制,不过那样动态代理类应该会非常庞大了吧?),

 

    在Java中,还有一种动态代理,他可以解决上面当Subject很多的时候,每个代理都要生成一个代理类的问题,其主要用到了java.lang.reflect包下的ProxyInvocationHandler.

首先我们让一个Handler类实现InvocationHandler接口,然后用ProxyProxy.newProxyInstance(loader, interfaces, h)方法生成一个动态代理对象,其中的三个参数分别为:第一个制类的装载器,第二个是要生成的动态代理类的接口,第三个是实现了InvocationHandler接口的Handler类,当调用生成出来的动态代理对象的方法时,他就自动去调用HandlerinvokeInvocationHandler接口要求必须实现invoke方法)这样就实现了动态代理,即使有很多类,也只要一个代理即可。

 

 

        还有两个不太明白的地方就是invoke方法里的第一个参数,proxy,应该就是动态代理对象,但是他传到invoke里面做什么呢?因为在invoke里再调用他肯定会形成死循环,估计是不是invoke方法调用的时候要用到proxy这个对象,但是如果我们是用不到这个对象的,sun为什么还写在这里呢?不能把它隐藏起来么?还有就是上面我说的细粒度的权限控制问题,如果几个对象的权限访问机制都不一样,哪么就必须得在invoke中来处理,这样的话,invoke方法将非常庞大,希望各位高手能指点下哈,本人第一次写blog,感觉自己的表达能力真的是很差,写这么一篇文章就花了1个多小时,呵呵,以后只能多加练习了。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页