0
点赞
收藏
分享

微信扫一扫

java 之映射


代码核心功能说明:

  1. 类动态加载
    Class.forName("Person") 运行时加载类
  2. 构造对象
  • 无参构造:getDeclaredConstructor().newInstance()
  • 有参构造:指定参数类型并实例化
  1. 字段操作
  • 公共字段:getField() 直接访问
  • 私有字段:getDeclaredField() + setAccessible(true) 突破限制
  1. 方法调用
  • 普通方法:getMethod() + invoke()
  • 私有方法:同样需 setAccessible(true)
  1. 异常处理
    所有反射异常直接抛出到 main 方法外(简化代码)

关键技巧

  • 获取方法时需指定参数类型(如 getMethod("getInfo", String.class)
  • 调用私有成员必须使用 setAccessible(true)
  • 有参构造需通过 getDeclaredConstructor 明确参数类型列表

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionDemo {
    public static void main(String[] args) throws Exception {
        // ================== 1. 动态加载类 ==================
        Class<?> personClass = Class.forName("Person");
        
        // ================== 2. 反射创建对象 ==================
        // 无参构造创建对象
        Object person1 = personClass.getDeclaredConstructor().newInstance();
        
        // 有参构造创建对象(需指定参数类型)
        Constructor<?> constructor = personClass.getDeclaredConstructor(String.class, int.class);
        Object person2 = constructor.newInstance("张三", 25);
        System.out.println("有参构造对象: " + person2); // 输出: Person[name=张三, age=25]

        // ================== 3. 操作字段 ==================
        // 修改公共字段
        Field nameField = personClass.getField("name");
        nameField.set(person1, "李四");
        
        // 修改私有字段(需突破访问限制)
        Field ageField = personClass.getDeclaredField("age");
        ageField.setAccessible(true); // 解除私有权限
        ageField.set(person1, 30);
        System.out.println("修改后对象: " + person1); // 输出: Person[name=李四, age=30]

        // ================== 4. 调用方法 ==================
        // 调用公共无参方法
        Method displayMethod = personClass.getMethod("display");
        displayMethod.invoke(person1); // 输出: Person{name='李四', age=30}
        
        // 调用重载方法(带参数)
        Method infoMethod = personClass.getMethod("getInfo", String.class);
        String info = (String) infoMethod.invoke(person1, "测试信息");
        System.out.println("带参方法调用: " + info); // 输出: 姓名:李四 年龄:30 | 测试信息
        
        // 调用私有方法
        Method secretMethod = personClass.getDeclaredMethod("secretMethod");
        secretMethod.setAccessible(true);
        secretMethod.invoke(person1); // 输出: 私有方法被调用!
    }
}

// 被反射操作的类
class Person {
    public String name;
    private int age;

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

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

    public void display() {
        System.out.println("Person{name='" + name + "', age=" + age + "}");
    }

    public String getInfo(String extra) {
        return "姓名:" + name + " 年龄:" + age + " | " + extra;
    }

    private void secretMethod() {
        System.out.println("私有方法被调用!");
    }

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


举报

相关推荐

0 条评论