mulinka

踏实肯干,不可眼高手低
posts - 3, comments - 0, trackbacks - 0, articles - 15
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Dynamic proxy(动态代理模式)

Posted on 2005-07-29 11:10 魔之卡卡 阅读(483) 评论(0)  编辑  收藏 所属分类: 我的JAVA
Java 1.3引入了名为“动态代理类”(Dynamic Proxy Class)的新特性,利用它可为“已知接口的实现”动态地创建包装器(wrapper)类。

使用动态代理,你创建的包装器类不要求为所有方法都使用显式的包装器,创建的子类也不要求具有严格的出身,两者方法可任选一种你认为最好的。但是,动态代理仍然有一个限制。当你使用动态代理时,要包装/扩展的对象必须实现一个接口,该接口定义了准备在包装器中使用的所有方法。这一限制的宗旨是鼓励良好的设计,而不是为你带来更多的麻烦。根据经验,每个类都至少应该实现一个接口(nonconstant接口)。良好的接口用法不仅使动态代理成为可能,还有利于程序的模块化。

2种写invoke()
注意:必须有return method.invoke(wrapped, args)

以下内容为程序代码:

 public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Class[] paramTypes = method.getParameterTypes();
        for (int i=0; i < paramTypes.length; i++) {
            if (Tool.class.isAssignableFrom(paramTypes[i])) {
                args[i] = Tool.RATCHET;
            }
        }
        return method.invoke(wrapped, args);
    }

  public Object invoke(Object proxy, Method m, Object[] args)
           throws Throwable {
       Object result;
       try {
           System.out.println("before method " + m.getName());
           result = m.invoke(obj, args);
       } catch (InvocationTargetException e) {
           throw e.getTargetException();
       } catch (Exception e) {
           throw new RuntimeException("unexpected invocation exception: "
                  + e.getMessage());
       } finally {
           System.out.println("after method " + m.getName());
       }
       return result;
    }
}


运行效果如下:
before method bar
after method bar


dynamic proxy的实战步骤
实际上dynamic proxy只有关键以下几个东西
一、业务接口:一个Interface
二、实现业务接口的类:一个继承Interface的Class
三、自己写一个继承了java.lang.reflect.InvocationHandler的Handler类
四、在这个Handler类中实现invoke()方法
五、在invoke()方法中一定要记得写return method.invoke(wrapped, args)
六、要使Handler和自己的业务接口关联还的写下面的代码(一般写在Handler类中)

以下内容为程序代码:

    public static Object newInstance(Object obj) {
       return java.lang.reflect.Proxy.newProxyInstance(obj.getClass()
              .getClassLoader(), obj.getClass().getInterfaces(),new Handler(obj));
    }

这样返回的就是经过代理的对象了(把原对象和Handler绑定到一起)

dynamic proxy的典型应用《使用JAVA中的动态代理实现数据库连接池》

dynamic proxy在JDBC上的应用
IBM文章:
《使用JAVA中的动态代理实现数据库连接池》

只有注册用户登录后才能发表评论。


网站导航: