zoukankan      html  css  js  c++  java
  • JAVA学习之反射getDeclaredField()方法与getField()方法的区别

     

    在使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊,
    比如:
    Class.getFields(), Class.getField(String), Class.getDeclaredFields(), Class.getDeclaredField(String)

    Class.getMethods(), Class.getMethod(String, Class[]), Class.getDeclaredMethods(), Class.getDeclaredMethod(String, Class[])
    主要的就是有没有Declared单词的区别,
    经过仔细研究有Declared单词的是获取的是某个类自己定义的成员,包括公开的,私有的,保护的等等的字段或方法,
    如果没有Declared单词的一般都是获取某个类所拥有的所有公开的成员,包括自己定义的和继承下来的公开成员,如公开的字段和继承的公开的方法.
    如以下代码所示:

    import java.lang.reflect.*;
    public class Test2
    {
        public static void main(String[] args) throws Exception
        {
            Person p = new Person();// 实例化一个父类
    
            Field[] pf1 = p.getClass().getFields();// getFields()方法获取所表示的类或接口的所有可访问公共字段。包括继承过来的可访问公共字段
            show(pf1);
            Field[] pf2 = p.getClass().getDeclaredFields();// getDeclaredFields()方法获取对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。
            show(pf2);
    
            Student s = new Student();// 实例化一个子类
    
            Field[] pf3 = s.getClass().getFields();// getFields()方法获取所表示的类或接口的所有可访问公共字段。包括继承过来的可访问公共字段
            show(pf3);
            Field[] pf4 = s.getClass().getDeclaredFields();// getDeclaredFields()方法获取对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。
            show(pf4);
        }
    
        // 方便打印的方法
        public static void show(Field[] fields)
        {
            for (Field f : fields)
            {
                System.out.println(f);
            }
            System.out.println("----------------------");
        }
    }
    
    // 父类
    class Person
    {
        private String name;
        private String sex;
        private String address;
        public String school;
        public String zip;
    }
    
    // 子类
    class Student extends Person
    {
        private String code;
        private String classmate;
        public String teacher;
        public String desk;
    }

    上面的代码中,有两个类一个是父类Person,一个是子类Student分别都有一些公开的和私有的字段,方法略.其中子类还有从父类继承过来的两个公开字段
    在测试代码中,都是分别调用getFields()和getDeclaredFields(),关打印结果,结果如下:

    这里有一个测试题目,也是用到这个字段的用法,之前没有深入研究的时候可是纠结了我好久啊
    需求是:
    写一个方法,此方法可将obj对象中名为propertyName的属性的值设置为value.

    public void setProperty(Object obj, String propertyName, Object value){ /*一些实现代码*/}

    对应是答案是:

        public static void setProperty(Object object,String propertyName,Object value) throws Exception
        {
            Class<?> c=object.getClass();
            Field f=c.getDeclaredField(propertyName);//取得这个类自己定义的所有公开的私有的字段,但是不包括继承的字段
            f.setAccessible(true);
            f.set(object,value);    
        }
    //在这里我们用getDeclaredField()方法在这个类自己定义的所有字段,但是不包括继承的字段中查找名字为形参"propertyName"的字段,然后给这个字段重新赋值.

    没事代码还是要多多敲才有用啊.

     

  • 相关阅读:
    2021寒假每日一题《棋盘挑战》
    2021寒假每日一题《货币系统》
    2021寒假每日一题《红与黑》
    2021寒假每日一题《字母图形》
    2021寒假每日一题《完全背包问题》
    2021寒假每日一题《找硬币》
    python 迭代器和生成器
    python for循环
    python集合
    python字符串常用操作
  • 原文地址:https://www.cnblogs.com/fylx/p/3990607.html
Copyright © 2011-2022 走看看