Java 2平台1.3版本为Java映像API(Reflection API)增加了一个极其实用的扩展:动态代理类。一个动态代理类就是一个实现了一系列运行时指定的接口的类。这个代理可以象它真正实现了这些接口一样使用。换句话说,可以直接在代理对象上调用任意接口的任意方法——当然,必须先进行必要的类型定型(casting)。由此,我们可以用动态代理类为一组接口创建一个类型安全的代理对象,且不必象使用编译时工具一样预先生成代理(有关动态代理类更详细的说明,请参见本文最后的参考资源)。
接下来我将介绍一个以动态代理类为基础的框架,这个框架使得SOAP(简单对象访问协议)客户程序的创建更加简单和直观。SOAP是一种用XML编码数据的有线协议。在本系列文章的第二篇、第三篇构造SOAP服务的过程中,我们发现客户程序的开发者必须多做许多原来不必做的工作。为帮助回忆,你可以看一下第二篇文章中的SOAP服务代码,看看和客户程序代码相比较时,服务程序的SOAP代码是多么微不足道。本系列文章前几篇所创建的简单SOAP服务显示出,基于SOAP的服务只包含无论用不用SOAP都必须提供的代码。服务程序的开发者要编写的额外代码很少,而客户程序开发者却有许多额外工作要做。本文介绍的类将把这些额外工作减到最少。
一、介绍SOAP代理类 首先,我要给出如果客户程序使用了本文创建的框架,它将变成什么样子:
package hello; import soapproxy.*; public class Client { public static void main(String[] args) { try { Class[] interfaces = new Class[] {hello.Hello.class}; Hello hello = (Hello)(Proxy.newInstance("urn:Hello",interfaces)); // 调用sayHelloTo方法 // 这个sayHelloTo方法需要一个字符串参数 System.out.println(hello.sayHelloTo("John")); // 调用sayHelloTo方法 // 这个sayHelloTo方法需要一个Name JavaBean参数 Name theName = new Name(); theName.setName("Mala"); System.out.println(hello.sayHelloTo(theName)); } catch(Exception e) { e.printStackTrace(); } } } |
……