抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Java反射机制

获取类对象

类对象

类对象,用于描述这种类,都有什么属性,什么方法的

获取类对象

  • Class.forName();

  • Hero.class

    (注:Hero是自定义类的类名)

  • new Hero().getClass()

在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。

1
2
3
4
5
6
7
8
String className = "charactor.Hero";

Class pClass1 = Class.forName(className);
Class pClass2 = Hero.class;
Class pClass3 = new Hero().getClass();

System.out.println(pClass1 == pClass2);//true
System.out.println(pClass1 == pClass3);//true

获取类对象,会导致类属性的初始化

无论什么途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。

(除了直接使用 Class c = Hero.class 这种方式,这种方式不会导致静态属性被初始化)

创建类对象

使用反射机制创建类对象,3个步骤

  1. 获取类对象
  2. 获取构造器
  3. 通过构造器实例化
1
2
3
4
5
6
7
8
9
10
//使用反射的方式创建对象
String className = "charactor.Hero";
//类对象
Class pClass = Class.forName(className);

//构造器
Constructor c = pClass.getConstructor();

//通过构造器实例化
Hero h2 = (Hero) c.newInstance();

属性访问

用法

使用反射机制获取并修改类对象属性(也叫字段Field),4个步骤

  1. 导包
  2. 获取类对象
  3. 获取属性(字段)—— getDeclaredField
  4. 修改指定对象的属性值—— set
1
2
3
4
5
6
7
8
9
import java.lang.reflect.Field;

Hero h = new Hero();

Class c = h.getClass();

Field f = c.getDeclaredField("name");

f1.set(h, "teemo");//修改这个字段的值

区分 getField 与 getDeclaredField

  • 这两个方法都是用于获取字段

  • getField 只能获取public的,包括从父类继承来的字段。

  • getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。

    : 这里只能获取到private的字段,但并不能访问该private字段的,除非加上setAccessible(true)

方法获取

  1. 导包
  2. 获取类对象
  3. 获取到方法—— getMethod
  4. 调用指定对象的方法—— invoke
1
2
3
4
5
6
7
8
9
import java.lang.reflect.Method;

Hero h = new Hero();

// 获取这个名字叫做setName,参数类型是String的方法
Method m = h.getClass().getMethod("setName", String.class);

// 对h对象,调用这个方法
m.invoke(h, "garent");

评论