> For the complete documentation index, see [llms.txt](https://dizzzzy.gitbook.io/notebook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dizzzzy.gitbook.io/notebook/vulnerability-detection/javascript/java-reflection.md).

# Java Reflection

Java反射（Reflection）是Java的一种强大功能，可以在运行时动态操作类的信息（属性、方法、构造器等），甚至可以访问和修改私有成员

示例类person

```java
package com.example;

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

    public Person() {
        this.name = "默认名";
        this.age = 0;
    }

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

    private void sayHello(String msg) {
        System.out.println(name + " 说: " + msg);
    }

    @Override
    public String toString() {
        return name + " - " + age;
    }
}

```

## 获取Class对象

```java
// 方式1：通过对象调用getClass()
Person person = new Person();
Class<?> clazz1 = person.getClass();

// 方式2：通过类名.class
Class<?> clazz2 = Person.class;

// 方式3：通过Class.forName("包名.类名")
Class<?> clazz3 = Class.forName("com.example.Person");

```

## 获取类的结构（字段、方法、构造器）

```java
Class<?> clazz = Class.forName("com.example.Person");

// 获取所有字段（包括私有）
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
    System.out.println("字段：" + field.getName());
}

// 获取所有方法（包括私有）
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
    System.out.println("方法：" + method.getName());
}

// 获取所有构造器
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
    System.out.println("构造器：" + constructor);
}

```

## 访问和修改字段

```java
Class<?> clazz = Class.forName("com.example.Person");
Object obj = clazz.getDeclaredConstructor().newInstance();

// 获取私有字段
Field field = clazz.getDeclaredField("name");
field.setAccessible(true); // 打破私有封装
field.set(obj, "张三"); // 设置字段值

// 获取字段值
String name = (String) field.get(obj);
System.out.println("name = " + name);
```

## 调用方法

```java
Class<?> clazz = Class.forName("com.example.Person");
Object obj = clazz.getDeclaredConstructor().newInstance();

// 获取方法（有参数方法需要指定参数类型）
Method method = clazz.getDeclaredMethod("sayHello", String.class);
method.setAccessible(true); // 可访问私有方法
method.invoke(obj, "反射调用");
```

## 构造函数创建对象

```java
Class<?> clazz = Class.forName("com.example.Person");

// 获取有参构造器
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true); // 如果是私有构造器
Object obj = constructor.newInstance("李四", 20);

```

### Java反射+反序列化实现URLDNS链

{% embed url="<https://www.cnblogs.com/leyilea/p/18426070>" %}
