介绍
提供了丰富且精心设计过得工具集,使得可以编写动态操纵Java代码的程序
- 场景:戴昂应用于JavaBeans中
- 用途:
- 运行时分析类的能力
- 运行时查看对象,例如编写一个toString方法供所有类使用
- 实现通用的数组操作代码
- 利用Method对象,这个对象很像C++中的函数指针
Class类
Java在运行时每一个对象始终有一个运行时的类型标识,虚拟机可以利用运行时类型信息选择相应的方法执行,而保存这些信息的类被称为Class
常用方法
getClass()
返回一个Class实例getName()
返回类的名字Class.forName(className)
获得类名对应的Class对象(该方法就可以使得类名动态的保存在字符串中,运行时随时改变)(使用该方法时注意提供一个异常处理器)Xxx.class
直接获取Class对象
使用技巧
- 问题:启动时往往main方法的类会加载包含的所有需要的类,而类也会加载需要的类,过程非常的耗时
- 解决方法:可以利用1.确保包含在main方法的类没有显式的引用其他类,仅仅是给出一个启动画面,然后通过调用Class.forName手工的加载其他的类
注意
- 问题:
Double[].class.getName()
由于历史原因,使用getName方法应用于数组类型的时候会返回一个很奇怪的名字 - 解决方法:
- 1.
if(e.getClass()==Employee.class)...
利用==实现两个类对象比较操作 - 2.
e.getClass().newInstance();
利用newInstance动态的创建一个实例(此方法调用默认构造器) - 3.
String s = "java.util.Random" Object m = Class.forName(s).newInstance();
(如果希望能在构造时提供参数,就必须使用Constructor类中的newInstance方法)
- 1.
利用反射分析类
java.lang.reflect包中有三个类:Field、Method、Constructor,分别用于描述类的域、方法和构造器
getFields\getMethods\getConstructors
方法分别返回类提供的public域、方法和构造数组(包括超类的公有成员)geDeclaretFields\get全部DeclareMethods\getDeclareConstructors
方法分别返回类提供的域、方法和构造器(包括私有和受保护成员但不包括超类成员)- 三者都有
getName()
返回项目的名称getModifiers
返回整形数值,描述public和static 这样的修饰符使用状况- 可以使用Modifier类中的
isPublic\isPrivate\isFinal
判断是否为对应修饰符
- 可以使用Modifier类中的
- Field
getType()
返回描述域所属Class对象
- Method
- 能够报告参数类型的方法
- 一个可以报告返回类型的方法
- Constructor
- 能够报告参数类型的方法