`

java 反射机制(六)总结

阅读更多
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
包中。
l  Class类:代表一个类。
l  Field类:代表类的属性。
l  Method类:代表类的方法。
l  Constructor 类:代表类的构造方法。
l  Array类:提供了动态创建数组,以及访问数组元素的静态方法。
l  Proxy类和InvocationHandler 接口:提供了生成动态代理类及其实例的方法。
本章还介绍了Java 反射机制、静态代理模式和动态代理模式在远程方法调用中的
运用。本章以SimpleClient客户调用SimpleServer 服务器上的HelloServiceImpl对象的方法为例,探讨了实现远程方法调用的一些技巧。
练习题
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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics