5、获取Class中的字段
5、获取Class中的字段
5.1 getField(String name) 只获取共有的字段
- 返回一个 Field对象,它反映此表示的类或接口的指定公共成员字段 类对象。
/**
* 获取字节码文件的字段
*/
@Test
public void getFieldDemo() throws Exception {
Class clazz = Class.forName("com.hw.bean.Person");
Field name = clazz.getField("name");
System.out.println(name);
}
运行:

报错,原因是字段是私有的。
要反映的字段由以下算法确定。 让C成为由该对象表示的类或接口:
- 如果C声明一个具有指定名称的公共字段,那就是要反映的字段。
- 如果在上述步骤1中没有找到字段,则将该算法递归地应用于C的每个直接超级接口。直接超级接口按照它们被声明的顺序被搜索。
- 如果在上面的步骤1和2中没有找到字段,并且C具有超类S,则该算法在S上递归地调用。如果C没有超类,则抛出NoSuchFieldException 。
5.2 getDeclaredField(String name) 只获取本类 但包含私有
@Test
public void getFieldDemo() throws Exception {
Class clazz = Class.forName("com.hw.bean.Person");
Field field = // clazz.getField("name");
clazz.getDeclaredField("name");
Object instance = clazz.newInstance();
Object age = field.get(instance);
}
运行:

还是报错,不能访问私有的
5.3 java.lang.reflect.AccessibleObject
- AccessibleObject类是Field,Method和Constructor对象的基类。 它提供了将反射对象标记为在使用它时抑制默认Java语言访问控制检查的功能。
- 当使用Fields,Methods或Constructors来设置或获取字段,调用方法,或创建和初始化新的类实例时,执行访问检查(对于public,默认(包)访问,受保护和私有成员)。
5.3.1 setAccessible(boolean flag) 暴力访问
- 将此对象的 accessible标志设置为指示的布尔值。
@Test
public void getFieldDemo() throws Exception {
Class clazz = Class.forName("com.hw.bean.Person");
Field field = // clazz.getField("name");
clazz.getDeclaredField("name");
// 对私有字段的访问取消权限检查。暴力访问
field.setAccessible(true);
Object instance = clazz.newInstance();
// 对字段赋值
field.set(instance,"张四");
Object name = field.get(instance);
System.out.println(name);
}
运行:

本章节源码: ReflectDemo3
5、获取Class中的字段的更多相关文章
- [SQL]获取所有数据库名、获取数据库中表名、获取表中的字段名
--()获取所有数据库名: Select Name FROM Master..SysDatabases order by Name --()获取所有表名 --XType=''U'':表示所有用户表; ...
- 获取Django中model字段名 字段的verbose_name
obj._meta.fields 为关键 obj为model类 推荐使用函数 from django.apps import apps def getmodelfield(appname,modeln ...
- 【Java】java获取json中某个字段
import com.alibaba.fastjson.JSONObject; public class JsonTest { public static void main(String[] arg ...
- mysql获取表中的字段名
转载请注明来源:https://www.cnblogs.com/hookjc/ SELECT COLUMN_NAME FROM 'information_schema'.'COLUMNS' where ...
- 使用python来反查数据表中的字段名
1. 链接数据库 import psycopg2 conn = psycopg2.connect(user,host,port,database,password) cur = conn.cursor ...
- c++获取sqlite3数据库表中所有字段的方法
常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 方法1:使用s ...
- Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)
反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...
- Dynamics CRM 插件Plugin中获取和更新时间字段值的准确转换
前面两篇介绍了后台代码通过组织服务获取更新时间字段.窗体javascript通过Odata获取更新时间字段,最后篇来实验下在插件中的获取和更新时间字段是否需要时制的转化,为何说是最后篇呢,因为在CRM ...
- Sql中获取表结构(字段名称,类型,长度,说明)
Sql中获取表结构(字段名称,类型,长度,说明) SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Descript ...
随机推荐
- javaIO -- 流的体系设计思路、基础分类
一.流 1. 流的含义 在程序设计中,流是对于数据流动传输的一种抽象描述任何有能力产出数据的数据源,或者有能力接受数据的接收端对象都是一个流. 2. 流的源和目的 数据可能从本地文件读取,或者写入, ...
- VC++实现遍历指定文件夹
VC++实现遍历指定文件夹,并进行深度遍历,一级,二级...最终列出该文件夹下所有文件全路径. #include "stdafx.h" #include <iostream& ...
- linux破解navicat for mysql
第一次执行start_navicat时,会在用户主目录下生成一个名为.navicat64的隐藏文件夹. cd ~/.navicat64 此文件夹下有一个system.reg文件 rm system.r ...
- wordpress 后台无法登录 网站内容缺失
昨天网站又突然不正常了,前两天都是好的.. 具体来说就是wp后台登录不进去,一直在登录页跳转,与此同时服务器上其他网站也有这个问题,而且有些网站的板块内容也缺失了, 所以首要就是要登录进后台看看是不是 ...
- Python--读取数据库
原文地址:https://www.wukong.com/answer/6591280609824342286/?iid=40708017633&app=news_article&sha ...
- PAT(B) 1013 数素数(Java)
题目链接:1013 数素数 代码 /** * Score: 20 * Run Time: 124ms * @author wowpH * @version 1.0 */ import java.uti ...
- Python开发【第三章】:编码转换
一.字符编码与转码 1.bytes和str 之前有学过关于bytes和str之间的转换,详细资料->bytes和str(第四字符串) 2.为什么要进行编码和转码 由于每个国家电脑的字符编码格式不 ...
- uboot 代码执行顺序
ref:http://blog.chinaunix.net/uid-30352139-id-5128405.html uboot: 2014.07 1.1 U-boot相关文件 boards.c ...
- 怎样理解数组的空元素empty与undefined的区别
数组的空元素empty表示空位, 它不是一种数据类型, 而是由于人为修改arr.length 或者写入时多写了逗号造成的. var arr = [1,2,3,4,,,5]; arr.length; a ...
- 嗯 第二道线段树题目 对左右节点和下标有了更深的理解 hdu1556
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...