10.4 小结
Java反射机制是Java语言的一个重要特性。考虑实现一个newInstance(String className)方法,它的作用是根据参数className指定的类名,通过该类的不带参数的构造方法创建这个类的对象,并将其返回。如果不运用Java反射机制,必须在newInstance()方法中罗列参数className所有可能的取值,然后创建相应的对象:
|
以上程序代码很冗长,而且可维护性差。如果在以后软件的升级版本中去除了一个HelloService4类,或者增加了一个HelloService1001类,都需要修改以上newInstance()方法。
如果运用反射机制,就可以简化程序代码,并且提高软件系统的可维护性和可扩展性:
|
Java反射机制在服务器程序和中间件程序中得到了广泛运用。在服务器端,往往需要根据客户的请求,动态调用某一个对象的特定方法。此外,有一种ORM(Object-Relation Mapping,对象-关系映射)中间件能够把任意一个JavaBean持久化到关系数据库中。在ORM中间件的实现中,运用Java反射机制来读取任意一个JavaBean的所有属性,或者给这些属性赋值。在作者的另一本书《精通Hibernate:Java对象持久化技术详解》中阐述了Java反射机制在Hibernate(一种ORM中间件)的实现中的运用。
在JDK类库中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中。
◆Class类:代表一个类。
◆Field类:代表类的属性。
◆Method类:代表类的方法。
◆Constructor类:代表类的构造方法。
◆Array类:提供了动态创建数组,以及访问数组元素的静态方法。
◆Proxy类和InvocationHandler接口:提供了生成动态代理类及其实例的方法。
本章还介绍了Java反射机制、静态代理模式和动态代理模式在远程方法调用中的运用。本章以SimpleClient客户调用SimpleServer服务器上的HelloServiceImpl对象的方法为例,探讨了实现远程方法调用的一些技巧。本书第11章介绍的RMI框架是JDK类库提供的一个现成的完善的远程方法调用框架。即使程序员不了解这个框架本身的实现细节,也能使用这个框架。不过,熟悉框架本身的实现原理,可以帮助程序员更娴熟地运用RMI框架。本章对实现远程方法调用所作的初步探讨,有助于程序员去进一步探索RMI框架本身的实现原理。
10.5 练习题
1.假定Tester类有如下test方法:
|
以下哪段代码能正确地动态调用一个Tester对象的test方法?(单选)
A.
|
B.
|
C.
|
D.
|
2.以下哪些方法在Class类中定义?(多选)
A.getConstructors() B.getPrivateMethods() C.getDeclaredFields()
D.getImports() E.setField()
3.以下哪些说法正确?(多选)
A.动态代理类与静态代理类一样,必须由开发人员编写源代码,并编译成.class文件
B.代理类与被代理类具有同样的接口
C.java.lang.Exception类实现了java.io.Serializable接口,因此Exception对象可以被序列化后在网络上传输
D.java.lang.reflect包中的Proxy类提供了创建动态代理类的方法
4.以下哪些属于动态代理类的特点?(多选)
A.动态代理类是public、final和非抽象类型的
B.动态代理类继承了java.lang.reflect.Proxy类
C.动态代理类实现了getProxyClass()或newProxyInstance()方法中参数interfaces指定的所有接口
D.动态代理类可以继承用户自定义的任意类
E.动态代理类都具有一个public类型的构造方法,该构造方法有一个InvocationHandler类型的参数
5.在本章10.3.3节(在远程方法调用中运用代理类)介绍的例子中,Connector类位于服务器端还是客户端?(单选)
A.服务器端 B.客户端
6.在本章10.3.3节(在远程方法调用中运用代理类)介绍的例子中,HelloServiceProxy类位于服务器端还是客户端?(单选)
A.服务器端 B.客户端
7.运用本章介绍的动态代理机制,重新实现第1章的EchoServer服务器与EchoClient客户,具体实现方式参照本章10.3.3节(在远程方法调用中运用代理类)所介绍的例子。
答案:1.C 2.AC 3.BCD 4.ABCE 5.B 6.B
(责任编辑 火凤凰 sunsj@51cto.com QQ:34067741 TEL:(010)68476636-8007)






















