栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java Reflect - 利用反射访问属性值

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java Reflect - 利用反射访问属性值

文章目录
      • 1. getFields() - 获取所有可访问的公共字段
      • 2. getDeclaredFields() - 获取所有可访问的字段
      • 3. getField(String name) - 获取指定公共字段
      • 4. getDeclaredField(String name) - 获取指定字段
      • 5. 利用反射给属性赋值

通过Class对象的getFields()或getField()方法可以获取该类所包括的全部Field或指定Field。Field提供了如下两组方法来读取或设置Field值。

  • getXxx(Object obj):获取obj对象该Field的属性值。此处的Xxx对应8个基本类型,如果该属性的类型是引用类型,则取消get后面的Xxx。
  • setXxx(Object obj,Xxx val):将obj对象的该Field设置成val值。此处的Xxx对应8个基本类型,如果该属性的类型是引用类型,则取消set后面的Xxx。
public class Person {
    //私有的成员变量
    private String name;
    //默认的
    int age;
    //公共的
    public String address;

    public Person() {
        super();
    }
    //没有用public修饰的构造方法
    Person(int age, String address) {
        super();
        this.age = age;
        this.address = address;
    }

    //私有的构造方法
    private Person(String name) {
        super();
        this.name = name;
        this.age = age;
    }
    //公共的构造方法
    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public void show() {
        System.out.println("show");
    }

    public void method(String s) {
        System.out.println("method"+s);
    }

    public String getString(String s,int i) {
        return s+"....."+i;
    }

    public void function() {
        System.out.println("function");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}
1. getFields() - 获取所有可访问的公共字段

Class 对象所表示的类或接口的所有可访问公共字段

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {

        Class clazz = Class.forName("com.example.redislock.reflect.Person");
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
    }
}

2. getDeclaredFields() - 获取所有可访问的字段

Class 对象所表示的类或接口所声明的所有字段

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {

        Class clazz = Class.forName("com.example.redislock.reflect.Person");
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
    }
}

3. getField(String name) - 获取指定公共字段

Class 对象所表示的类或接口的指定公共成员字段

name表示属性名称

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {

        Class clazz = Class.forName("com.example.redislock.reflect.Person");
        Field address = clazz.getField("address");
        System.out.println(address);
    }
}

4. getDeclaredField(String name) - 获取指定字段

Class 对象所表示的类或接口的指定已声明字段

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {

        Class clazz = Class.forName("com.example.redislock.reflect.Person");
        Field name = clazz.getDeclaredField("name");
        System.out.println(name);
    }
}

5. 利用反射给属性赋值
public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {

        Class clazz = Class.forName("com.example.redislock.reflect.Person");
        // 创建对应
        Object obj = clazz.newInstance();

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

        // 因为name属性没有public修饰,取消权限检查
        field.setAccessible(true);

        // 给引用类型的字段赋值,给obj对象的nam字段赋值为zhangsan,其中obj对象就是Person对象
        field.set(obj,"zhangsan");

        // 获取obj对象字段的值
        System.out.println(field.get(obj));
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/845704.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号