关闭

Field类的概述和使用

古今自逍遥 1年前 ⋅ 176 阅读

在这里插入图片描述

在获取一个类的属性时由两种方式:

1.得到实现的接口或父类中的公共属性:public Field[] getFields()

2.得到本类中的全部属性:public Field[] getDeclaredFields()

反射类的常用方法
public Object get(Object obj) //得到一个对象中属性的具体内容
public void set(Object obj,Object value) //设置指定对象中属性的具体内容
public int getModifiers() //得到属性的修饰符
public String getName() //返回此属性的名称
public boolean isAccessible() //判断此属性是否可被外部访问
public void setAccesssible(boolean flag) //设置一个属性是否可被外部访问
public static void setAccessible(AccessibleObject[] array,boolean flag) //设置一组属性是否可以被外部访问
public String toString() //返回此Field类的信息

代码演示
Person类
/**
 * ClassName Person
 *
 * @Description: TODO
 * @Author 
 * @Date 2022/8/21  16:06
 * @Version 1.0
 */
public class Person {
    public  String name;
    private String sex;

    public Person(){

    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}
1、测试公有的属性
package com.imooc.reflect.test;

import org.junit.Test;

import java.lang.reflect.Field;

/**
 * ClassName FieldTest
 *
 * @Description: TODO
 * @Author 
 * @Date 2022/8/21  19:53
 * @Version 1.0
 */
public class FieldTest {
    @Test
    /**
     * 测试公有的属性
     */
    public void demo01() throws Exception{
        //获得Class
        Class class1 = Class.forName("com.imooc.reflect.test.Person");
        //获得这个类的名为“name"属性的对象;
        Field name = class1.getField("name");
        /**
         *int getModifiers()获得修饰符(注意这里返回的是int类型)
         * String getType()获得该属性对象的类型
         * String getName()返回此属性的名称
         * boolean isAccessible()判断此属性是否可被外部访问
         * void setAccesssible(boolean flag) 设置一个属性是否可被外部访问
         * static void setAccessible(AccessibleObject[] array,boolean flag) 设置一组属性是否可以被外部访问
         * String toString() //返回此Field类的信息
         */
         //输出一下属性对象的一些信息
        System.out.println(name.getModifiers()+"----"
                +name.getType().getName()+"----"
                +name.getName()+"----"
                +name.isAccessible()+"----"
                +name.toString());

        System.out.println();

        //创建这个类的对象
        Person person = (Person) class1.newInstance();
        //调用这个name对象的set方法 设置name属性的值,传入该属性对象的对象,并且传入要修改的值。
        name.set(person, "陆大涛");
        System.out.println(person);
        //调用这个name对象的get方法 获得name属性的值,传入该属性对象的对象,
        String name1 = (String) name.get(person);
        //得到这个属性的值之后可打印出来
        System.out.println(name1);


    }

程序输出结果

在这里插入图片描述

2、测试私有的属性

这里用到了 field.setAccessible(true);为了让私有属性能够被操作

 @Test
    /**
     * 测试私有的属性
     */
    public void demo02() throws Exception {
        //这里我使用了泛型的写法。
        Class<Person> class1 = (Class<Person>) Class.forName("com.imooc.reflect.test.Person");
        //创建Person实例对象。因为我上面定义了泛型,所以我反射的类一定是Person类。就不需要强转了。
        Person person = class1.newInstance();
        //传入属性的名字,然后得到该属性对象,注意,这里获得的是私有的属性
        Field field = class1.getDeclaredField("sex");
        //操作属性
        field.setAccessible(true);
        field.set(person, "大男人");
        System.out.println(person);

        //得到属性
        Object o = field.get(person);
        System.out.println(o);


    }

程序输出结果

在这里插入图片描述


全部评论: 0

    我有话说: