2007-01-02
代理,动态代理,反射
关键字: proxy,dynamic proxy, reflectionJava中Proxy,Dynamic Proxy以及Reflection是什么关系呢?谈这个问题之前,我们要先了解三者究竟是什么东西。
一、Proxy。面向对象中Proxy是比较常用的,作为GOF 23个模式之一,Proxy在Design Patterns一书中有着详细的描述。Proxy的使用范围很广,下面以一个简单的访问控制为例。在这种情况下,外部使用者要想使用某个对象,必须通过该对象的代理进行。在这里,Proxy充当着“网关”的角色,这样,在外部触及到内部对象之前,我们可以做很多有意义的工作,如身份认证等。下面是一个简单的例子:
java 代码
- public class ProxyTest { //劳工使用方
- public static void main(String[] args) {
- Job job = new Proxy(new Worker()); //劳工使用方找到代理,让它进行code的工作
- job.code();
- }
- }
- interface Job{
- public void code();
- }
- class Proxy implements Job{ //代理声称可以code
- private Worker wrk;
- public Proxy(Worker wrk){
- this.wrk = wrk;
- }
- public void code(){
- //代理把工作交给worker之前,可以进行使用者是否合法
- System.out.println("Check the permission");
- wrk.code();
- //worker做完以后,代理还可以做更多的工作
- System.out.println("Get the saraly");
- }
- }
- //Worker实际做code的工作,但是使用者不能直接找到他,
- //而要通过代理
- class Worker implements Job{
- public void code() {
- System.out.println("Worker code actually");
- }
- }
二、Dynamic Proxy。上面的Proxy,也可以叫做静态代理,它的特征是代理和实际作业的对象的类都是在编译期间就已经定下来的。与此相对的是动态代理,其代理是在程序运行期间动态产生的。Java对动态代理提供了相应的API,但只能接口方法的动态代理。动态代理一个典型应用就是实现数据库的连接池。由于使用JDBC的程序员习惯在使用完数据库的Connection对象后调用该对象的close方法关闭连接,这样连接池就失去作用了。这个问题我们可以使用动态代理技术来解决,当程序员调用Connection的close方法时,我们将其拦截下来,将其归还到连接池中,而不是直接关闭物理连接。下面是动态代理的一个实例。
java 代码
- public class DynamicProxy {
- public static void main(String[] args) throws Exception {
- Job job = JobFactory.getJob();
- job.code();
- }
- }
- interface Job{
- public void code();
- }
- class Worker implements Job{
- public void code() {
- System.out.println("worker code");
- }
- public void play(){
- System.out.println("worker play");
- }
- }
- class Handler implements InvocationHandler{
- private Worker worker;
- public Handler(Worker worker){
- this.worker = worker;
- }
- public Object invoke(Object obj, Method mtd, Object[] objs) throws Throwable {
- Object res = null;
- System.out.println("check permission");
- res = mtd.invoke(worker, objs);
- System.out.println("get the saraly");
- return res;
- }
- }
- class JobFactory {
- public static Job getJob() {
- Worker worker = new Worker(); //这是代理,可以代理接口指定的工作
- if (!(worker instanceof Job ))//判断是否有资格当这些工作的代理
- return null;
- /* construct a invocation handler with the impl instance */
- InvocationHandler handler = new Handler(worker); //这是实际工作的人
- /* get the class info, and the class loader used by this factory */
- Class[] interfaces = new Class[] { Job.class};
- ClassLoader loader = JobFactory.class.getClassLoader();
- Job proxy = (Job) Proxy.newProxyInstance(loader, interfaces, handler);
- return proxy;
- }
- }
三、Reflection。Java中通过反射技术,我们可以在运行过程中得到相应类的各种方法和属性,并且可以进行修改和调用。动态代理技术就是基于反射实现的。当然,反射技术用处还很多,譬如JavaBean技术。
现在是比较清楚了,Proxy和Dynamic Proxy都是一种模式,两者实现的功能相当,但是方式不同;Reflection是实现后者的技术基础。
- 22:44
- 浏览 (538)
- 评论 (0)
- 分类: design pattern
- 相关推荐
发表评论
- 浏览: 48998 次
- 性别:

- 来自: 广州/成都

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
Two extractors couldn't ...
Update Scrubyt 0.3.4 to 0.4.01
-- by Dustin -
Bridge模式在JDBC中是如何 ...
哦。是这样的吧。JDBC有两个变化点。1.平台的变化2.数据库的变化。所以,这个 ...
-- by fireflyc -
Bridge模式在JDBC中是如何 ...
我觉得是jdbc的应用,实现DAO的时候用到了bridge模式吧,好像在哪里看到 ...
-- by crazycow -
背后的路【3】
一口气看完了...
-- by crazycow -
背后的路【2】
楼主有很多经历和我很像,希望能交个朋友,呵呵:)
-- by crazycow






评论排行榜