什么是反射?
Java 的反射机制可以使得程序在 Java 运行时能够检测、访问并且修改编译时完全未知的 classes,这个概念很容易和内省混淆。下面是 WiKi 上对这两个概念给出的定义:
反射(Reflection):反射是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。
内省(Introspection):内省是指计算机程序在运行检查对象类型的一种能力,通常也可以称作运行时类型检查。
从上面的定义可以看出,相对于内省,反射更进一步。例如,Java 具有反射特性,而 C++ 不具有反射特性只具有内省特性。
反射有什么用途?
反射主要提供以下功能:
在运行时检查对象的类型
在运行时新建类的实例
在运行时检测对象一个类的成员变量和方法
在运行时调用对象的任意方法
在运行时修改构造函数、成员变量和方法的访问权限
等等
例如,可以使用反射获得或修改一个对象的私有成员变量,调用对象的私有方法。而要在Java中使用反射,需要用到 java.lang.reflect 包中的下面几个类:
Class 类:java.lang.Class, 代表类的定义。
Construcor 类:java.lang.reflect.Constructor,代表类的构造函数。
Field 类:java.lang.reflect.Field,代表类的成员变量。
Method 类:java.lang.reflect.Method,代表类的方法。
Array 类:java.lang.reflect.Array,提供动态创建访问数组的静态方法
注:如果要反射内部类,Class.forName()
时类名需要写为 “packageName.className$innerClassName”
反射的使用例子
新建类的实例
|
|
获得类的静态属性
|
|
修改类的静态属性
|
|
获得对象的属性
|
|
获得对象所属类的父类中的属性
|
|
修改对象的属性
|
|
修改对象所属类的父类中的属性
|
|
调用类的静态方法
|
|
调用对象的方法
|
|
调用对象所属类的父类的方法
|
|
获得对象的类
这里要区分基本类型与其对应的包装类是不一样的
|
|
新建一个数组
|
|
获得数组的元素
|
|
修改数组的元素
|
|
最后给出我个人的源代码 http://johnnyshieh.me/uploads/ReflectionUtils.java
参考链接: