您所在的位置:开发 > Java > Java网络编程精解之Java语言的反射机制二(6)

Java网络编程精解之Java语言的反射机制二(6)

2007-02-11 16:51 孙卫琴 51CTO.com 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!

孙卫琴老师新作《Java网络编程精解》中的第十章“Java语言的反射机”,小编给它切分为一个小系列,共两篇文章。本文是其中的第二篇,具体内容包括代理模式、小结和学习本章内容后的练习题,供大家参考!

AD:

10.4  小结

Java反射机制是Java语言的一个重要特性。考虑实现一个newInstance(String className)方法,它的作用是根据参数className指定的类名,通过该类的不带参数的构造方法创建这个类的对象,并将其返回。如果不运用Java反射机制,必须在newInstance()方法中罗列参数className所有可能的取值,然后创建相应的对象:

public Object newInstance(String className) throws Exception{
if(className.equals("HelloService1"))
return new HelloService1();
if(className.equals("HelloService2"))
return new HelloService2();
if(className.equals("HelloService3"))
return new HelloService3();
if(className.equals("HelloService4"))
return new HelloService4();
...
if(className.equals("HelloService1000"))
return new HelloService1000();
}

以上程序代码很冗长,而且可维护性差。如果在以后软件的升级版本中去除了一个HelloService4类,或者增加了一个HelloService1001类,都需要修改以上newInstance()方法。

如果运用反射机制,就可以简化程序代码,并且提高软件系统的可维护性和可扩展性:

public Object newInstance(String className) throws Exception{
Class classType=Class.forName(className);
return classType.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方法:

public int test(int p1, Integer p2)

以下哪段代码能正确地动态调用一个Tester对象的test方法?(单选)

A.

Class classType=Tester.class;
Object tester=classType.newInstance();
Method addMethod=classType.getMethod("test",new Class[]{int.class,int.class});
Object result=addMethod.invoke(tester,
new Object[]{new Integer(100),new Integer(200)});

B.

Class classType=Tester.class;
Object tester=classType.newInstance();
Method addMethod=classType.getMethod("test",new Class[]{int.class,int.class});
int result=addMethod.invoke(tester,
new Object[]{new Integer(100),new Integer(200)});


C.

Class classType=Tester.class;
Object tester=classType.newInstance();
Method addMethod=classType.getMethod("test",new Class[]{int.class,Integer.class});
Object result=addMethod.invoke(tester,
new Object[]{new Integer(100),new Integer(200)});

D.

Class classType=Tester.class;
Object tester=classType.newInstance();
Method addMethod=classType.getMethod("test",new Class[]{int.class,Integer.class});
Integer result=addMethod.invoke(tester,
new Object[]{new Integer(100),new Integer(200)});


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)


内容导航

分享到:

网友评论TOP5

查看所有评论(

提交评论

  1. 专题:JVM编程语言,你的选择?
  2. 宅男程序员给老婆课程之11:域模型

文章排行

本月本周24小时

热点专题

更多>>

读书

安全模式:J2EE、Web服务和身份管理最佳实践与策
本书全面阐述Java应用安全的基本知识并介绍一种强大的结构化安全设计方法;介绍独立于厂商的安全架构;列出详细的评估核对表以及

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 移动互联网生活门户 灵客风LinkPhone