获取类结构

之前写过一个java反射的理解java反射的理解
获取类结构本质上就是获取类的java.lang.Class对象

拿Person类举例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.mick.test;

public class Person {
public String name;
private int sex;

public Person(String name, Integer sex){
this.name = name;
this.sex = sex;
}

public Person() {
}

public void speck(){
System.out.println(name + ":" + (sex>0? "男":"女"));
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex=" + sex +
'}';
}
}

类属性操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Class<?> person = Class.forName("com.mick.test.Person");

// 创建Person对象用于测试
Person test33 = (Person)person.getDeclaredConstructor(String.class, Integer.class).newInstance("test33", 1111);

// 获取所有定义的方法
Field[] declaredFields = person.getDeclaredFields();

for (Field field:declaredFields) {
field.setAccessible(true); // 访问改为public
System.out.println(field.get(test33).toString());
}

// 单独获取一个私有属性
Field sex = person.getDeclaredField("sex");
// 设置为可访问
sex.setAccessible(true);
// 修改对象属性值
sex.setInt(test33, 3333333);
System.out.println(test33);
类方法调用
1
2
3
4
5
6
7
8
9
10
11
12
13
Class<?> person = Class.forName("com.mick.test.Person");

// 创建Person对象用于测试
Person test33 = (Person)person.getDeclaredConstructor(String.class, Integer.class).newInstance("test33", 1111);

Method[] declaredMethods = person.getDeclaredMethods();
for (Method m:declaredMethods) {
System.out.println(m.getName());
}

Method speck = person.getDeclaredMethod("speck");
speck.setAccessible(true);
System.out.println(speck.invoke(test33)); // 返回值和直接调用speck返回值一致,这里没有返回值,返回null
反射常用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
      Class.getDeclaredAnnotations();
Class.getDeclaredAnnotation(null);
Class.getDeclaredConstructors();
Class.getDeclaredConstructor(null);
Class.getDeclaredFields();
Class.getDeclaredField("test");
Class.getDeclaredMethods();
Class.getDeclaredMethod(null);
Field.setAccessible();
Method.setAccessible();
Method.invoke();
Field.setAccessible();
Field.set*()
Field.get*()