java基础名词解析(四)吐血总结实战中反射的应用

举报
小鲍侃java 发表于 2021/09/10 22:32:09 2021/09/10
【摘要】 概念 反射 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),...

概念

反射 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。

一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。

尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

用白话讲 反射 能够获取java类在运行过程中(class文件)的对象,方法,成员变量。

ps:反射能获取private方法,楼主面试常问。

应用

Class类:代表一个类

Field类:代表类的成员变量

Method类:代表类的方法

Constructor类:代表类的构造方法

Array类:提供了动态创建数组,以及访问数组的元素的静态方法

获取类的变量


  
  1. public Object getProperty(Object objectString fieldName) throws Exception {  
  2.      Class class = object.getClass();  //得到该类的Class。
  3.      Field field = class .getField(fieldName);  //获取声明属性
  4.      Object property = field.get(object);  //获取类属性
  5.      return property;  

获取类的静态变量


  
  1. public Object getStaticProperty(String className, String fieldName)  
  2.              throws Exception {  
  3.      Class class = Class.forName(className);  //获取类的Class
  4.      Field field = class.getField(fieldName);   //获取声明的属性
  5.      Object property = field.get(Class);  获取静态属性
  6.      return property;  
  7. }  

执行类的方法


  
  1. public Object invokeMethod(Object objectString methodName, Object[] args) throws Exception {  
  2.      Class Class = object.getClass();   //获取class对象
  3.      Class[] argsClass = new Class[args.length];   //获取参数
  4.      for (int i = 0, j = args.length; i < j; i++) {  
  5.          argsClass[i] = args[i].getClass();  
  6.      }  
  7.      Method method = class.getMethod(methodName,argsClass);   //获取方法
  8.      return method.invoke(object, args);   //通过发射调用方法
  9. }  

执行类的静态方法


  
  1. public Object invokeStaticMethod(String className, String methodName,  
  2.              Object[] args) throws Exception {  
  3.      Class Class = Class.forName(className);  //获取class
  4.      Class[] argsClass = new Class[args.length];  
  5.      for (int i = 0, j = args.length; i < j; i++) {  
  6.          argsClass[i] = args[i].getClass();  
  7.      }  //获取参数
  8.      Method method = class.getMethod(methodName,argsClass);  //获取方法
  9.      return method.invoke(null, args);   //通过反射执行
  10.  }  

新建实例


  
  1. public Object newInstance(String className, Object[] args) throws Exception {  
  2.      Class class = Class.forName(className); //获取class 
  3.      Class[] argsClass = new Class[args.length];  
  4.      for (int i = 0, j = args.length; i < j; i++) {  
  5.          argsClass[i] = args[i].getClass();  
  6.      }  //获取参数
  7.      Constructor cons = class.getConstructor(argsClass);  //获取构造方法
  8.      return cons.newInstance(args);  //新建实例
  9.    
  10. }  

判断是否是指定类


  
  1. public boolean isInstance(Object obj, Class cls{  
  2.      return cls.isInstance(obj);  
  3. }  

获取数组属性


  
  1. public Object getByArray(Object arrayint index) {  
  2.      return Array.get(array,index);  
  3. }  

文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。

原文链接:baocl.blog.csdn.net/article/details/86534132

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。