-
在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识,这个信息跟踪着每个对象所属的类,虚拟机利用运行时类型信息选择相应的方法执行。这些信息也可以通过专门的Java类访问,保存这些信息的类被称为Class
,这个名称很容易让人混淆,Object
类中的getClass()
方法将会返回一个Class
类型的实例
-
一个Class对象实际上表示的是一个类型,而这个类型未必一定是一种类,例如int不是类,但int,.class是一个Class类型的对象
-
java.lang.reflect
包中有三个类Field
、Method
和Constructor
分别用于描述类的域、方法和构造器
-
Field[] getFields()
:返回一个包含Filed对象的数组,这些对象记录了这个类或其超类的公有域
-
Field getField(String name)
:返回指定名称的公有域
-
Field[] getDeclaredFields()
:也返回一个包含Filed对象的数组,但记录的是全部域,如果类中没有域,或者Class对象描述的是基本类型或数组类型,这些方法将返回一个长度为0的数组
-
Field getDeclaredField()
:返回指定名称的域
-
Method[] getMethods()
:返回包含Method对象的数组,将返回所有的公有方法,包括从超类继承的公有方法
-
Method[] getDeclaredMethods()
:返回这个类或接口的全部方法,但不包括继承来的方法
-
Constructor[] getConstructors()
:返回包含了Class对象的类所有公有构造器
-
Constructor[] getDeclaredConstructors()
:返回包含了Class对象的类所有构造器
-
void setAccessible(boolean flag)
:为反射对象设置可访问标志
-
Object get(Object obj)
:返回obj对象中用Field对象表示的域值
-
void set(Object obj, Object newValue)
:用一个新值设置Obj对象中Filed对象表示的域
-
一个利用反射修改域值的例子:
Class cl = a.getClass();
Object obj=cl.newInstance()
Field f = cl.getDeclaredFiled(name);
f.setAccessible(true);
f.set(obj,"aaa");