Posted on 2005-07-29 11:10
魔之卡卡 阅读(489)
评论(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中的动态代理实现数据库连接池》