0%

java反射机制

java反射机制

Java反射机制是Java语言中一个强大的工具,它允许程序在运行时检查和操作类的结构和行为,写tomcat内存马的时候遇到了就来详细看看

Java反射机制提供了一些类和接口,允许开发者在运行时获取类的元数据如类名、方法、属性等,并对这些元数据进行操作

反射机制的核心类

1
2
3
4
5
6
Class:表示类和接口,提供了获取类的元数据的方法
Constructor:表示类的构造方法
Field:表示类的属性
Method:表示类的方法
Array:提供了动态创建数组和获取数组元素的反射方法
Modifier:提供了一些方法来解读类和成员的访问修饰符

他们都位于java.lang.reflect包中

反射的常规操作

获取Class对象

1
2
3
4
5
6
7
8
9
10
11
12
13
// 方式一:通过类名
Class<?> clazz1 = MyClass.class;

// 方式二:通过对象getClass()方法实例
MyClass obj = new MyClass();
Class<?> clazz2 = obj.getClass();

// 方式三:通过Class.forName()方法对类的全限定名
Class<?> clazz3 = Class.forName("com.example.MyClass");

//方式四:通过类加载器
ClassLoader classLoader = MyClass.class.getClassLoader();
Class<?> clazz = classLoader.loadClass("com.example.MyClass");

获取类的构造方法

1
2
3
4
Constructor<?>[] constructors = clazz1.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}

获取类的属性

1
2
3
4
Field[] fields = clazz1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}

获取类的方法

1
2
3
4
Method[] methods = clazz1.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}

操作属性

1
2
3
4
5
6
7
8
//获取类的字段信息
Field field = clazz1.getDeclaredField("someField");
//访问私有字段
field.setAccessible(true); // 设置为可访问
//读取字段的值
field.set(obj, "newValue"); // 设置属性值
//修改字段的值
Object value = field.get(obj); // 获取属性值

调用方法

1
2
3
4
5
//获取方法信息
Method method = clazz1.getDeclaredMethod("someMethod", String.class);
//调用方法
method.setAccessible(true); // 设置为可访问
Object result = method.invoke(obj, "argument"); // 调用方法

实例

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class ReflectionDemo {

public static void main(String[] args) {
try {
// 获取Class对象
Class<?> clazz = Class.forName("com.example.Person");

// 获取类的构造方法
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object person = constructor.newInstance("John Doe", 30);

// 获取和操作属性
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
System.out.println("Name before: " + nameField.get(person));
nameField.set(person, "Jane Doe");
System.out.println("Name after: " + nameField.get(person));

// 获取和调用方法
Method getNameMethod = clazz.getDeclaredMethod("getName");
System.out.println("Invoked getName: " + getNameMethod.invoke(person));

Method setNameMethod = clazz.getDeclaredMethod("setName", String.class);
setNameMethod.setAccessible(true);
setNameMethod.invoke(person, "John Smith");
System.out.println("Invoked setName: " + getNameMethod.invoke(person));

} catch (Exception e) {
e.printStackTrace();
}
}
}

class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

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

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

参考:

[bookmarklink]


来源: https://www.yuque.com/guansuanbangzhuangganjun/oxmbxg/huyewlyqkpxg07a5
语雀文档ID: 191958438