Java反射机制
获取类对象
类对象
类对象,用于描述这种类,都有什么属性,什么方法的
获取类对象
-
Class.forName();
-
Hero.class
(注:Hero是自定义类的类名)
-
new Hero().getClass()
在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。
1 | String className = "charactor.Hero"; |
获取类对象,会导致类属性的初始化
无论什么途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。
(除了直接使用 Class c = Hero.class 这种方式,这种方式不会导致静态属性被初始化)
创建类对象
使用反射机制创建类对象,3个步骤
- 获取类对象
- 获取构造器
- 通过构造器实例化
1 | //使用反射的方式创建对象 |
属性访问
用法
使用反射机制获取并修改类对象属性(也叫字段Field
),4个步骤
- 导包
- 获取类对象
- 获取属性(字段)——
getDeclaredField
- 修改指定对象的属性值——
set
1 | import java.lang.reflect.Field; |
区分 getField 与 getDeclaredField
-
这两个方法都是用于获取字段
-
getField
只能获取public的,包括从父类继承来的字段。 -
getDeclaredField
可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true)