Java反射之调用成员变量

简介: 笔记

通过反射机制还可以调用成员变量,调用方法需要使用Field对象,它对应着一个方法,获得Field对象 需要使用Class类的如下方法:


Field[] getFields():返回所有公有成员变量Field对象数组。

Field[] getDeclaredFields():返回所有成员变量Field对象数组。

Field getField(String name):通过指定公共成员变量名返回Field对象。

Field getDeclaredField(String name):通过指定成员变量名返回Field对象。

现有一个Person类,它的代码如下:

public class Person {
    private String name;
    private int age;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

现在编写一个程序通过反射机制调用Person类的私有成员变量name和age,具体代码如下:

public class HelloWorld {
    public static void main(String[] args) {
        try {
            Class clz = Class.forName("Java反射机制.调用成员变量.Person");
//            调用默认构造方法
            Person person = (Person) clz.newInstance();
//            返回成员变量名为name的Field对象
            Field name = clz.getDeclaredField("name");
//          设置成员变量accessible标志为ture:accessible是可访问性标志,值为 true 则指 示反射的对象在使用时应该取消Java语言访问检查
            name.setAccessible(true);
//            为成员变量name赋值
            name.set(person,"tony");
//            返回成员变量名为age的Field对象
            Field age = clz.getDeclaredField("age");
//            设置成员变量accessible标志为ture
            age.setAccessible(true);
//            为成员变量age赋值
            age.set(person,21);
//            获取成员变量保存的数据
            System.out.printf("[name:%s, age:%d]",name.get(person),age.get(person));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

[name:tony, age:21]
相关文章
|
1天前
|
设计模式 Java Spring
来聊聊Java的反射机制(下)
来聊聊Java的反射机制(下)
5 0
|
3天前
|
Java
Java 反射
Java 反射
|
4天前
|
设计模式 Java 索引
由反射引出的Java动态代理与静态代理
由反射引出的Java动态代理与静态代理
12 0
|
4天前
|
存储 Java Shell
深入剖析Java中的反射,由浅入深,层层剥离!
深入剖析Java中的反射,由浅入深,层层剥离!
10 1
|
8天前
|
监控 Java 开发者
掌握 Java 反射和动态代理
【4月更文挑战第19天】Java反射和动态代理提供强大功能和灵活性。反射允许运行时检查和操作类,获取类信息、动态调用方法,但可能带来性能损失和降低代码可读性。动态代理则用于创建代理对象,实现透明性和横切关注点分离,常用于日志、权限检查等。两者结合能实现更复杂功能。掌握这些技术能提升代码的灵活性和可扩展性,但也需注意性能和可读性。通过学习和实践,能更好地构建高效软件系统。
|
15天前
|
Java
代码的魔法师:Java反射工厂模式详解
代码的魔法师:Java反射工厂模式详解
26 0
|
19天前
|
安全 Java
java反射篇
java反射篇
|
19天前
|
存储 Java
java反射——设计框架的灵魂
java反射——设计框架的灵魂
|
25天前
|
Java
Java通过反射获取类调用方法
Java通过反射获取类调用方法
18 0
|
1月前
|
设计模式 XML 存储
java中的反射机制
java中的反射机制
12 1