Java能否像JavaScript一样通过字符串访问对象属性?
Java中通过字符串访问对象属性的实现方式
Java本身没有像JavaScript那样直接用object["property"]的语法访问对象属性的支持,但可以利用**反射(Reflection)**机制实现类似功能。
核心实现思路
- 先获取目标对象的
Class实例,可通过对象.getClass()或类名.class两种方式获取。 - 借助
Class对象的getField(String name)(仅能访问公共属性)或getDeclaredField(String name)(可访问任意修饰符的属性,包括私有)方法,传入属性名字符串得到对应的Field对象。 - 调用
Field的get(Object obj)方法读取属性值,或set(Object obj, Object value)方法修改属性值。若目标属性是私有修饰,需先调用field.setAccessible(true)解除访问限制。
示例代码
import java.lang.reflect.Field; public class ReflectDemo { public static void main(String[] args) throws Exception { Person person = new Person(); person.setNickname("Bob"); person.setAge(30); // 读取私有属性nickname的值 Class<?> personClass = person.getClass(); Field nicknameField = personClass.getDeclaredField("nickname"); nicknameField.setAccessible(true); String nicknameValue = (String) nicknameField.get(person); System.out.println("昵称: " + nicknameValue); // 输出 昵称: Bob // 修改私有属性age的值 Field ageField = personClass.getDeclaredField("age"); ageField.setAccessible(true); ageField.set(person, 31); System.out.println("年龄: " + person.getAge()); // 输出 年龄: 31 } } class Person { private String nickname; private int age; public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
注意事项
- 反射会产生一定性能损耗,且绕过了Java的封装机制,可能破坏代码的安全性和可维护性,非必要场景不建议大量使用。
- 操作反射时需处理
NoSuchFieldException、IllegalAccessException等异常。
内容的提问来源于stack exchange,提问作者Dark Rebellion
相关产品推荐
相关产品推荐

