反射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。

给对象属性赋值的三要素:

  1. 赋值的对象
  2. 对象的属性
  3. 要赋的值

读对象属性的二要素:

  1. 获取对象
  2. 使用该对象获取值
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类的学习相关推荐

  1. java field类,Java反射—Field类使用

    Field作为反射中对应类或对象中的域或者叫做属性的操作类,除了我前一篇文章中的得到名字和类型等,Field的作用不限于此. Java SE 8的Docs这样说:A Field provides in ...

  2. java反射取实体字符串_JAVA反射机制 通过反射 Field类获取和修改对象类的字符串值...

    实际编程中如果我们要使用系统中未暴露的方法,我们可以通过反射来使用这些方法,但在使用过程中我们很难确定方法对用的参数类型,以下的代码可以帮你得到这些信息: package cn.sunzn.refle ...

  3. java反射field_java反射field用法

    我们在前面的文章中学习了java反射机制是什么的问题,相信大家对反射机制有了全面的理解.在java中使用反射机制,会提高程序的灵活性和扩展性,还能节省资源,因此在java编程中使用好反射是重要的.今天 ...

  4. Java反射使用的Field类介绍

    一.Field类的作用 Field是一个类,位于java.lang.reflect包下.在Java反射中Field类描述的是类的属性信息,功能包括 (1)获取当前对象的成员变量的类型 (2)对成员变量 ...

  5. java 反射类 spring_学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  6. 超详细的逐句介绍Java反射之Field类和InvocationTargetException类函数源码讲解(全)

    一.Field类和InvocationTargetException类 InvocationTargetException 是一个经过检查的异常,它包装了被调用的方法或构造函数抛出的异常.Field提 ...

  7. Java反射 field

    Java反射 field 获取字节码文件对象 Class c = Class.forName("fieldtest.Student"); 通过无参构造方法创建对象obj Const ...

  8. java反射获取实现类_Java介绍通过反射获取类的信息

    免费学习推荐:java基础教程 目录1.获取Field 2.反编译Field 3.通过反射机制访问对象属性 4.可变长度参数 5.反射Method(了解) 6.反编译(了解) 7.反射机制调用方法 8 ...

  9. java method field_java_解析Java中的Field类和Method类,Field类 Field类中定义了一些方 - phpStudy...

    解析Java中的Field类和Method类 Field类Field类中定义了一些方法,可以用来查询字段的类型以及设置或读取字段的值.将这些方法与继承而来的member方法结合在一起.就可以使我们能够 ...

最新文章

  1. mysql8.0client_navicat 连接mysql8.0 报错client does not support authentication
  2. Building wheel for wrapt (setup.py) ... error的解决办法(图文)
  3. Eclipse GBK批量转UTF-8插件
  4. 安装linux后win7引导程序,安装Windows7+Ubuntu+CentOS三系统之后的引导问题
  5. Android--------从一个包中的Avtivity创建另外另外一个包的Context
  6. NOI2018网络同步赛爆零记
  7. 子矩阵最大累加和(详解)
  8. team网卡配置_Linux中多个网卡配置(team的配置方式)
  9. java电子书下载网站
  10. 【常见c语言笔试题嵌入式软件开发1】
  11. app测试和web测试的区别
  12. Google Chrome浏览器翻译失败
  13. 计算机类毕业设计评语导师评语,毕业设计指导老师评语
  14. 全面剖析canonical标签
  15. 关系数据库规范化理论
  16. 怎么释放C盘空间?清理C盘空间的4大方法分享!
  17. Plant Design Review Based on AnyCAD
  18. 服务器为什么需要防御呢?
  19. 调用office web 365接口实现在线预览word文档,PDF,PPT
  20. Cocos2d-x C++版仿《王者之剑》实现(v1.0.1版)

热门文章

  1. Unifier项目实施系列:02项目实施方法论
  2. 使用Markup解析xml字符串
  3. 【论文写作课程的启发和心得】
  4. 自动化助手的添加(红字公告的逆向分析C++实现函数调用以及菜单呼出)
  5. Linux alias命令详解
  6. C语言从入门到实战——函数
  7. [WUSTCTF2020]情书-WP
  8. PL/SQL initialization error could not initialize
  9. A9平板电脑的Cortex A9晶晨半导体的Andr​​oid 2.3双核无线​​蓝牙
  10. python画原型图,Digraph 安装采坑