1.        首先明确一点,getDeclaredFiled()只能取得本类独有的成员字段,getField()能取得本类独有的成员字段+父类的成员字段 但 这些都只能是public的. 所谓不可取得即是不可见,NoSuchField.

比如现在有两个类:

public class Animal {public String name;protected double appetite;int age;private String habitat;public Animal() {}public Animal(String name, double appetite, int age, String habitat) {this.name = name;this.appetite = appetite;this.age = age;this.habitat = habitat;}
}
public class Person extends Animal{public double height;protected double weight;String hobby;private double salary;public Person(){}public Person(double height, double weight, String hobby, double salary) {this.height = height;this.weight = weight;this.hobby = hobby;this.salary = salary;}}

测试的包结构如下:

先看同一包内的Demo1:

package demo.reflection1;import org.junit.Before;
import org.junit.Test;import java.lang.reflect.Field;/*** @Author Mr.Lee* @create 2021/12/16 16:01*/
public class Demo1 {Person person;Class<? extends Person> clazz;@Beforepublic void prepare(){person = new Person(183.5, 140, "游泳", 10000.0);clazz = person.getClass();}@Test
//    getDeclaredField()只能find本类独有的成员字段public void test1() throws NoSuchFieldException {System.out.println("-------------本类独有的成员字段都能被found:正常-------------");Field height = clazz.getDeclaredField("height");System.out.println(height);Field weight = clazz.getDeclaredField("weight");System.out.println(weight);Field hobby = clazz.getDeclaredField("hobby");System.out.println(hobby);Field salary = clazz.getDeclaredField("salary");System.out.println(salary);System.out.println("-----------父类的任意一个:报错,因为都不能被found----------------");Field name = clazz.getDeclaredField("name");System.out.println(name);Field appetite = clazz.getDeclaredField("appetite");System.out.println(appetite);Field age = clazz.getDeclaredField("age");System.out.println(age);Field habitat = clazz.getDeclaredField("habitat");System.out.println(habitat);}
}

    @Test
//    getField()能find本类独有的成员字段+父类的成员字段 但 这些都只能是public的.public void test2() throws NoSuchFieldException {System.out.println("------------public的都能被found:正常-----------");Field height = clazz.getField("height");System.out.println(height);Field name = clazz.getField("name");System.out.println(name);System.out.println("----------非public的任意一个:报错,因为都不能被found-----------");Field weight = clazz.getField("weight");Field hobby = clazz.getField("hobby");Field salary = clazz.getField("salary");Field appetite = clazz.getField("appetite");Field age = clazz.getField("age");Field habitat = clazz.getField("habitat");}

2.前面getDeclaredField()和getField()区分完了,接着看setAccissible()的作用.

先看同包下的Demo1:

    @Test
//    以getDeclaredField()为例,展示 setAccessible()的访问控制:
//    Demo1和Person同包,正常情况下只能够access public,protected,缺省 成员字段 ; 但通过 字段.setAccessible(true)可以access private成员字段public void test3_1() throws NoSuchFieldException, IllegalAccessException {System.out.println("---------权限够:正常--------");Field height = clazz.getDeclaredField("height");System.out.println(height.get(person));Field weight = clazz.getDeclaredField("weight");System.out.println(weight.get(person));Field hobby = clazz.getDeclaredField("hobby");System.out.println(hobby.get(person));System.out.println("-------权限不够,但setAccessible(true):正常--------");Field salary2 = clazz.getDeclaredField("salary");salary2.setAccessible(true);System.out.println(salary2.get(person));System.out.println("--------权限不够:报错,因为IllegalAccess-------");Field salary = clazz.getDeclaredField("salary");System.out.println(salary.get(person));}

Demo2: 不同包且无继承关系,故protected,缺省权限的字段也就不能访问了

package demo.reflection2;import demo.reflection1.Person;
import org.junit.Before;
import org.junit.Test;import java.lang.reflect.Field;/*** @Author Mr.Lee* @create 2021/12/16 16:04*/
public class Demo2 {Person person;Class<? extends Person> clazz;@Beforepublic void prepare(){person = new Person(183.5, 140, "游泳", 10000.0);clazz = person.getClass();}@Testpublic void test3_2() throws NoSuchFieldException, IllegalAccessException {System.out.println("---------权限够:正常--------");Field height = clazz.getDeclaredField("height");System.out.println(height.get(person));System.out.println("-------权限不够,但setAccessible(true):正常--------");Field salary2 = clazz.getDeclaredField("salary");salary2.setAccessible(true);System.out.println(salary2.get(person));Field weight2 = clazz.getDeclaredField("weight");weight2.setAccessible(true);System.out.println(weight2.get(person));Field hobby2 = clazz.getDeclaredField("hobby");hobby2.setAccessible(true);System.out.println(hobby2.get(person));System.out.println("--------权限不够:报错,因为不能access -------");Field weight = clazz.getDeclaredField("weight");System.out.println(weight.get(person));Field hobby = clazz.getDeclaredField("hobby");System.out.println(hobby.get(person));Field salary = clazz.getDeclaredField("salary");System.out.println(salary.get(person));}
}
}

3.关于found和access: 最后细心的你们一定发现了1中直接输出 getDecalredField() ,2中却输出的 字getDecalredField().get() .

2中讨论的权限 access的问题,对于getDecalredField()对所有的能被found的字段都能取得不存在illegalAccess,这样就起不到测试权限的作用.而getDecalredField().get()是取实例对象的字段值,可能存在illegalAccess.(可以理解为getDecalredField()返回的Field对象本身就是public的,而getDecalredField().get()返回的实例对象的成员字段权限取决于他自身)

JavaSE 反射中getDeclaredFiled,getField,setAccessible之间的关系和用法相关推荐

  1. JavaSE、JavaEE、JavaME三者之间的关系与区别

    Java 平台有三个版本,这使软件开发人员.服务提供商和设备生产商可以针对特定的市场进行开发: Java SE (Java Platform,Standard Edition).Java SE 以前称 ...

  2. 关于Rigidbody,Collider和CharacterController三者之间的关系和用法的总结

    Rule of Thumb Rigidbody:多用在"物体"上,因为"物体"都是"死"的,他们的运动一般都是靠物理系统.所以对于Rigid ...

  3. java中setSize(),setLocation(),setBounds三者之间的关系和用法

    开始学习java,感觉有好多小的东西都需要去进行总结,唉,没办法,既然选择了java那就一步一步来吧!加油! setSize(int width,int heigth): 就是定义控件的大小,setS ...

  4. Java反射中method.isBridge() 桥接方法

    Java反射中method.isBridge() 桥接方法 桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法.我们可 ...

  5. 在 Java 的反射中,Class.forName 和 ClassLoader 的区别

    前言 最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别.当时没有想出来后来自己研究了一下就写下来记录一下. 解释 在java中Cl ...

  6. 正态分布(高斯分布)、Q函数、误差函数、互补误差函数(定义,意义及互相之间的关系)高斯分布的分布概率反解

    1.正态分布 参考博客:https://www.cnblogs.com/htj10/p/8621771.html 概率密度函数的意义:理解概率密度函数 - 知乎 (zhihu.com) 若随机变量 服 ...

  7. Java 入门之1:浅谈Java的最基本概念及JDK、JRE、JVM之间的关系和区别

    目录 前言: 一句话介绍Java语言的故事 一句话概括Java的特性和优势 两句话阐述JAVA_HOME环境变量和classpath环境变量的作用是什么 简述JDK.JRE.JVM之间的关系 Java ...

  8. 编译+构建+链接+运行之间的关系分析

    编译+构建+链接+运行之间的关系分析 源文件+编译+部署+测试+打包 Maven+default: 验证(validate)+编译(compile)+测试(test)+打包(package)+验证(v ...

  9. 【数字信号处理】傅里叶变换性质 ( 序列对称分解定理示例 | 共轭对称序列与原序列之间的关系 | 共轭反对称序列与原序列之间的关系 )

    文章目录 一.序列对称分解定理示例 1.序列对称分解定理 2.因果序列 3.求解过程 n < 0 情况 n = 0 情况 n > 0 情况 实因果序列的对称序列与原序列关系 一.序列对称分 ...

最新文章

  1. 多线程join(加入)
  2. Python爬取近10万条程序员招聘数据,告诉你哪类人才和技能最受热捧!
  3. Android开发文章推荐
  4. Firefox about
  5. 武汉大学2013年数学分析考研试题参考解答
  6. 实现自己的promise
  7. python repusts模块_Python tslearn包_程序模块 - PyPI - Python中文网
  8. 大数据分块_谷歌卫星影像金字塔分块下载原理说明
  9. 步进电机选型计算实例_滚珠丝杠选型和电机选型计算
  10. 2008引导修复 鼠标键盘用不了_这5个提高键盘鼠标生产力的工具,后悔没早点发现!...
  11. 【渝粤教育】国家开放大学2018年春季 0605-22T中国古代文学(2) 参考试题
  12. BZOJ2303 APIO2011方格染色(并查集)
  13. python合并单元格居中_Python实现Excel自动分组合并单元格
  14. mysql导出到excel方法汇总
  15. 自学单片机是否先学c语言,学习单片机一定要先学好C语言再去学单片机吗
  16. 用Python进行数据分析之金融和经济数据应用
  17. 聚类算法_层次聚类_密度聚类(dbscan,meanshift)_划分聚类(Kmeans)详解
  18. ENVI5.3 安装教程,新手入门(超详细)附安装包和常见问题
  19. 服务器硬盘选金盘好吗,WD 西部数据 企业级 10T金盘与8T金盘 对比测试
  20. 三冲IPO,亨达海天能否敲开美股上市大门?

热门文章

  1. 基于PX4、树莓派和Mocap(Optitrack)的室内飞行环境搭建
  2. Citrix NetScaler HA(高可用性)解析
  3. 【商迪3D】全息投影3D电子数字沙盘的用途
  4. 前端《Vue.js从入门到项目实战》PDF课件+《微信小程序实战入门第2版》PDF代码调试
  5. 赛后总结2018-08-13
  6. 车道线检测分类--Lane Detection and Classification using Cascaded CNNs
  7. VMvare虚拟机Ubuntu系统鼠标闪烁解决方法
  8. 企业管理信息系统整体业务流程图
  9. 计算机专业可以考航空航天专业研究生吗,我是信息与计算科学专业的大二学生,想考北京航空航天计算机专业方向的研究生,那么从现在起我该做些什么...
  10. 110米栏排名:刘翔被梅里特超越 让出榜首位置