使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。
day034 反射(一)Class类、捕获异常、利用反射分析类的能力
反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序。这项功能被大量地应用于JavaBeans中,它是Java组件的体系结构。使用反射,Java可以支持Visual Basic用户习惯使用的工具。特别是在设计或运行中添加新类时,能够快速地应用开发工具动态地查询新添加类的能力。
能够分析类能力的程序称为反射(reflective)。反射机制的功能极其强大,在下面可以看到,反射机制可以用来:
•在运行时分析类的能力。
•在运行时查看对象,例如,编写一个toString方法供所有类使用。
•实现通用的数组操作代码。
•利用Method对象,这个对象很像C++中的函数指针。
反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员,如果仅对设计应用程序感兴趣,而对构造工具不感兴趣,可以跳过这部分,稍后再返回来学习。
1.Class类
在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。
然而,可以通过专门的Java类访问这些信息。保存这些信息的类被称为Class,这个名字很容易让人混淆。Object类中的getClass()方法将会返回一个Class类型的实例。
Employee e;
...
Class cl=e.getClass();
如同用一个Employee对象表示一个特定的雇员属性一样,一个Class对象将表示一个特定类的属性。最常用的Class方法是getName。这个方法将返回类的名字。例如,下面这条语句:
System.out.println(e.getClass().getName()+""+e.getName());
如果e是一个雇员,则会打印输出:
Employee Harry Hacker
如果e是经理,则会打印输出:
Manager Harry Hacker
如果类在一个包里,包的名字也作为类名的一部分:
Random generator=new Random();
Class cl=generator.getClass();
String name=cl.getName();
//name is set to"java.util.Random"
还可以调用静态方法forName获得类名对应的Class对象。
String className="java.util.Random";
Class cl=Class.forName(className);
如果类名保存在字符串中&#