Java高级_反射机制

类对象获取

先创建对象类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class User {

public String name;
private String sex;

static String str;
static {
str = "已经初始化!";
System.out.println("初始化..." + str);
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "User [name=" + name + ", sex=" + sex + "]";
}
}

有三种方式获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void test1() throws Exception {

// 初始化类静态属性
Class c1 = Class.forName("zhw.base.User");
System.out.println(c1);

// 不会初始化类静态属性
Class c2 = User.class;
System.out.println(c2);

// 初始化类静态属性
Class c3 = new User().getClass();
System.out.println(c3);
}

通过反射创建对象

1
2
3
4
5
6
7
8
public static void test2() throws Exception {
// 获取类对象
Class c1 = Class.forName("zhw.base.User");
// 通过类对象获取对象构造器
Constructor cc = c1.getConstructor();
// 通过构造器实例化对象
User cci = (User) cc.newInstance();
}

通过反射修改对象属性值

getField只能获取public属性,包括继承的属性

getDeclaredField可以获取本类所有属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void test3() throws Exception {
// 获取类对象
Class c1 = Class.forName("zhw.base.User");
// 通过类对象获取对象构造器
Constructor cc = c1.getConstructor();
// 通过构造器实例化对象
User cci = (User) cc.newInstance();
// 获取对象属性
// getField只能获取public属性,包括继承的属性
Field f1 = cci.getClass().getField("name");
// getDeclaredField可以获取本类所有属性
Field f2 = cci.getClass().getDeclaredField("sex");
f2.setAccessible(true);
// 设置值
f1.set(cci, "zhw");
f2.set(cci, "man");
System.out.println(cci);

}

通过反射调用对象方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void test4() throws Exception {
// 获取类对象
Class c1 = Class.forName("zhw.base.User");
// 通过类对象获取对象构造器
Constructor cc = c1.getConstructor();
// 通过构造器实例化对象
User cci = (User) cc.newInstance();

// 反射获取对象方法
Method m = cci.getClass().getMethod("setName", String.class);
// 调用方法
m.invoke(cci, "zhw");
System.out.println(cci.getName());

}

小唠嗑:

本章到这里就结束了,谢谢耐心看到这里的各位Boss,如果觉得有哪里说的不好的地方,还请高抬贵手多多原谅,不惜指教。

最后,谢谢!

---本文结束感谢您的阅读!---