反射Field类的学习
反射Field类的学习
反射属性Field
Field翻译为字段,其实就是属性/成员,每一个属性相当于一个Field对象。
Field的常用方法:
int getModifiers() // 获取属性的修饰符列表,但是返回的是一个整数,需要使用Modifier类的toString方法进行转化。
String getSimpleName() // 返回源代码中给出的底层类的简称。
Field[] getDeclaredFields() // 获取所有的Field
Field[] getFields() // 获取类中所有的public修饰的Field
Field getDeclaredField(String name) // 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
String getName() // 获取全类名
String getSimpleName() // 获取简类名
Class<?> getType() // 获取属性的类型
void setAccessible(boolean flag) // 将此对象的 accessible 标志设置为指示的布尔值,修改对象的属性的访问控制权限。
Modifier类的常用方法:
static String toString(int mod) // 将getModifiers方法返回的数字转化为相对应的字符串。
代码示例
import java.lang.reflect.*;public class Test {public static void main(String[] args) throws Exception{Class myClass = Class.forName("User");String className = myClass.getName();System.out.println("完整类名:" + className);// 完整类名:java.lang.StringString simpleName = myClass.getSimpleName();System.out.println("简类名:" + simpleName);// 简类名:String// 获取类中所有的public修饰的FieldField[] fields = myClass.getFields();System.out.println(fields.length); // 测试数组中只有2个元素// 取出这个FieldField field = fields[0];String fieldName = field.getName();System.out.println(fieldName);// 获取所有的FieldField[] fs = myClass.getDeclaredFields();System.out.println(fs.length); // 5for (Field f : fs){// 获取属性的修饰符列表int i = f.getModifiers(); // 返回的修饰符是一个数字,每个数字是修饰符的代号!!!System.out.println(i);// 可以将这个“代号”数字转换成“字符串”吗?String modifierString = Modifier.toString(i);System.out.println(modifierString);// 获取属性的类型Class fieldType = f.getType();String fieldTypeSimpleName = fieldType.getSimpleName();System.out.println(fieldTypeSimpleName);// 获取属性的名字String fn = f.getName();System.out.println(fn);}}
}
通过反射机制,反编译一个类的属性Field
import java.lang.reflect.*;
// 通过反射机制,反编译一个类的属性Field
public class Test {public static void main(String[] args) throws Exception{// 创建这个是为了拼接字符串。StringBuilder stringBuilder = new StringBuilder();Class myClass = Class.forName("java.lang.String");stringBuilder.append(Modifier.toString(myClass.getModifiers())+" class "+myClass.getSimpleName()+"{\n");Field[] fields = myClass.getDeclaredFields();for (Field field:fields){stringBuilder.append("\t");stringBuilder.append(Modifier.toString(myClass.getModifiers())+" ");stringBuilder.append(field.getType().getSimpleName()+" ");stringBuilder.append(field.getName()+"\n");}stringBuilder.append("}");System.out.println(stringBuilder);}
}
通过反射机制访问一个java对象的属性
给属性赋值set,获取属性的值get。
给对象属性赋值的三要素:
- 赋值的对象
- 对象的属性
- 要赋的值
读对象属性的二要素:
- 获取对象
- 使用该对象获取值
import java.lang.reflect.*;public class Test {public static void main(String[] args) throws Exception{// 不使用反射机制,怎么去访问一个对象的属性呢?User user = new User();// 给属性赋值user.no = 123; //三要素:给s对象的no属性赋值123,要素1:对象user,要素2:no属性,要素3:1111// 读属性值// 两个要素:获取user对象的no属性的值。System.out.println(user.no);// 使用反射机制,怎么去访问一个对象的属性。(set get)Class myClass = Class.forName("User");Object obj = myClass.newInstance();// obj就是User对象。(底层调用无参数构造方法)// 获取no属性(根据属性的名称来获取Field)Field noFiled = myClass.getDeclaredField("no");// 给obj对象(Student对象)的no属性赋值/*虽然使用了反射机制,但是三要素还是缺一不可:要素1:obj对象要素2:no属性要素3:666值注意:反射机制让代码复杂了,但是为了一个“灵活”,这也是值得的。*/noFiled.set(obj,666);// 读取属性的值// 两个要素:获取obj对象的no属性的值。System.out.println(noFiled.get(obj));// 可以访问私有的属性吗?Field nameField = myClass.getDeclaredField("name");// 打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会!!!)// 这样设置完之后,在外部也是可以访问private的。nameField.setAccessible(true);// 给name属性赋值nameField.set(obj, "jackson");// 获取name属性的值System.out.println(nameField.get(obj));}
}
反射Field类的学习相关推荐
- java field类,Java反射—Field类使用
Field作为反射中对应类或对象中的域或者叫做属性的操作类,除了我前一篇文章中的得到名字和类型等,Field的作用不限于此. Java SE 8的Docs这样说:A Field provides in ...
- java反射取实体字符串_JAVA反射机制 通过反射 Field类获取和修改对象类的字符串值...
实际编程中如果我们要使用系统中未暴露的方法,我们可以通过反射来使用这些方法,但在使用过程中我们很难确定方法对用的参数类型,以下的代码可以帮你得到这些信息: package cn.sunzn.refle ...
- java反射field_java反射field用法
我们在前面的文章中学习了java反射机制是什么的问题,相信大家对反射机制有了全面的理解.在java中使用反射机制,会提高程序的灵活性和扩展性,还能节省资源,因此在java编程中使用好反射是重要的.今天 ...
- Java反射使用的Field类介绍
一.Field类的作用 Field是一个类,位于java.lang.reflect包下.在Java反射中Field类描述的是类的属性信息,功能包括 (1)获取当前对象的成员变量的类型 (2)对成员变量 ...
- java 反射类 spring_学习Spring必学的Java基础知识(1)----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- 超详细的逐句介绍Java反射之Field类和InvocationTargetException类函数源码讲解(全)
一.Field类和InvocationTargetException类 InvocationTargetException 是一个经过检查的异常,它包装了被调用的方法或构造函数抛出的异常.Field提 ...
- Java反射 field
Java反射 field 获取字节码文件对象 Class c = Class.forName("fieldtest.Student"); 通过无参构造方法创建对象obj Const ...
- java反射获取实现类_Java介绍通过反射获取类的信息
免费学习推荐:java基础教程 目录1.获取Field 2.反编译Field 3.通过反射机制访问对象属性 4.可变长度参数 5.反射Method(了解) 6.反编译(了解) 7.反射机制调用方法 8 ...
- java method field_java_解析Java中的Field类和Method类,Field类
Field类中定义了一些方 - phpStudy...
解析Java中的Field类和Method类 Field类Field类中定义了一些方法,可以用来查询字段的类型以及设置或读取字段的值.将这些方法与继承而来的member方法结合在一起.就可以使我们能够 ...
最新文章
- mysql8.0client_navicat 连接mysql8.0 报错client does not support authentication
- Building wheel for wrapt (setup.py) ... error的解决办法(图文)
- Eclipse GBK批量转UTF-8插件
- 安装linux后win7引导程序,安装Windows7+Ubuntu+CentOS三系统之后的引导问题
- Android--------从一个包中的Avtivity创建另外另外一个包的Context
- NOI2018网络同步赛爆零记
- 子矩阵最大累加和(详解)
- team网卡配置_Linux中多个网卡配置(team的配置方式)
- java电子书下载网站
- 【常见c语言笔试题嵌入式软件开发1】
- app测试和web测试的区别
- Google Chrome浏览器翻译失败
- 计算机类毕业设计评语导师评语,毕业设计指导老师评语
- 全面剖析canonical标签
- 关系数据库规范化理论
- 怎么释放C盘空间?清理C盘空间的4大方法分享!
- Plant Design Review Based on AnyCAD
- 服务器为什么需要防御呢?
- 调用office web 365接口实现在线预览word文档,PDF,PPT
- Cocos2d-x C++版仿《王者之剑》实现(v1.0.1版)
热门文章
- Unifier项目实施系列:02项目实施方法论
- 使用Markup解析xml字符串
- 【论文写作课程的启发和心得】
- 自动化助手的添加(红字公告的逆向分析C++实现函数调用以及菜单呼出)
- Linux alias命令详解
- C语言从入门到实战——函数
- [WUSTCTF2020]情书-WP
- PL/SQL initialization error could not initialize
- A9平板电脑的Cortex A9晶晨半导体的Andr​​oid 2.3双核无线​​蓝牙
- python画原型图,Digraph 安装采坑