温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Field字段如何反射

发布时间:2026-10-06 21:22:11 来源:亿速云 阅读:86 作者:小樊 栏目:编程语言

在 Java 中,可以通过 反射(Reflection) 来操作类的 Field(字段),包括获取字段信息、读取字段值、设置字段值,甚至访问 private 字段。

下面从基础到常见用法给你一个完整说明。


一、获取 Class 对象

要使用反射,第一步是拿到 Class 对象:

Class<?> clazz = MyClass.class;
// 或
Class<?> clazz = Class.forName("com.example.MyClass");
// 或
Class<?> clazz = obj.getClass();

二、获取 Field 字段

1. 获取指定字段(包括 private)

Field field = clazz.getDeclaredField("name");

2. 获取所有字段

Field[] fields = clazz.getDeclaredFields(); // 本类所有字段
Field[] fields2 = clazz.getFields();        // 公共字段(含父类)

三、访问私有字段(关键)

如果是 private 字段,必须设置:

field.setAccessible(true);

四、读取字段值(get)

MyClass obj = new MyClass();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);

Object value = field.get(obj);
System.out.println(value);

如果是 static 字段:

Object value = field.get(null);

五、设置字段值(set)

field.set(obj, "张三");

static 字段:

field.set(null, "静态值");

六、获取字段信息

field.getName();        // 字段名
field.getType();        // 字段类型
field.getModifiers();   // 修饰符(public/private/static...)

判断是否 private:

Modifier.isPrivate(field.getModifiers());

七、完整示例

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

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws Exception {
        User user = new User("Tom", 18);
        Class<?> clazz = user.getClass();

        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            System.out.println(field.getName() + " = " + field.get(user));
        }

        Field nameField = clazz.getDeclaredField("name");
        nameField.setAccessible(true);
        nameField.set(user, "Jerry");

        System.out.println(nameField.get(user));
    }
}

八、注意事项(很重要)

  1. 性能较低:反射比直接调用慢
  2. 破坏封装:可访问 private 字段
  3. 安全限制:某些环境(如模块化、SecurityManager)会禁止
  4. Java 9+ 模块系统:
    --add-opens java.base/java.lang=ALL-UNNAMED
    

如果你有具体场景(比如:

  • 反射 Map / List
  • 反射修改 final 字段
  • Spring 中的 Field 注入
  • 反射工具类封装

可以直接说,我可以给你更针对性的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手