21.反射-获取基本属性

本文详细介绍了Java反射API中的Field类,包括如何获取字段信息以及如何通过反射读写字段。示例代码展示了如何访问非public字段,并强调了setAccessible(true)的重要性。通过Field对象,可以获取字段的名称、类型和修饰符,以及进行字段的读写操作,但这种操作可能破坏对象的封装性。
摘要由CSDN通过智能技术生成


instanceof不但匹配指定类型,还匹配指定类型的子类。而用 ==判断 class实例可以精确地判断数据类型,但不能作子类型比较。
==是精确匹配

Field getField(name):根据字段名获取某个public的field(包括父类)
Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
Field[] getFields():获取所有public的field(包括父类)
Field[] getDeclaredFields():获取当前类的所有field(不包括父类)

调用Field.setAccessible(true)的意思是,别管这个字段是不是public,一律允许访问。

import java.lang.reflect.Field;

public class Main {

    public static void main(String[] args) throws Exception {
        Object p = new Person("Xiao Ming");
        Class c = p.getClass();
        Field f = c.getDeclaredField("name");
        f.setAccessible(true);
        Object value = f.get(p);
        System.out.println(value); // "Xiao Ming"
    }
}

class Person {
    private String name;

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


Xiao Ming

public class Main {

    public static void main(String[] args) throws Exception {
        Person p = new Person("Xiao Ming");
        System.out.println(p.getName()); // "Xiao Ming"----公共方法
        Class c = p.getClass();//反射
        Field f = c.getDeclaredField("name");
        f.setAccessible(true);
        f.set(p, "Xiao Hong");
        System.out.println(p.getName()); // "Xiao Hong"
        //修改非public字段,需要首先调用setAccessible(true)。
    }
}

class Person {
    private String name;

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

    public String getName() {
        return this.name;
    }
}


Xiao Ming

Xiao Hong

一个 Field对象包含了一个字段的所有信息:

getName():返回字段名称,例如, "name";
getType():返回字段类型,也是一个 Class实例,例如, String.class;
getModifiers():返回字段的修饰符,它是一个 int,不同的bit表示不同的含义。

 

小结

Java的反射API提供的 Field类封装了字段的所有信息:

通过 Class实例的方法可以获取 Field实例: getField(), getFields(), getDeclaredField(), getDeclaredFields();

通过Field实例可以获取字段信息: getName(), getType(), getModifiers();

通过Field实例可以读取或设置某个对象的字段,如果存在访问限制,要首先调用 setAccessible(true)来访问非 public字段。

通过反射读写字段是一种非常规方法,它会破坏对象的封装。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值