Java基础教程:反射基础

引入反射

反射是什么

  能够动态分析类能力的程序称为反射。

  反射是一种很强大且复杂的机制。

Class类

  在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识。这个对象追踪着每个对象所属的类。虚拟机利用运行时类的信息选择相应的方法执行

  我们可以通过专门的Java类访问这些信息。保存这些信息的类称为Class。

根据对象获得类信息:

MyClass myClass;
.....
Class cl = myClass.getClass();
cl.getName(); //获得类名

补充:获得Class类的另外两种方式

1.调用静态方法forName获得类名相应的Class对象。

String className = 'java.util.Date';
Class cl = Class.forName(className);

2.直接获取

Class cl1 =Date.class;
Class cl2 = Integer.class;

注意:

  虚拟机为每一个类型管理一个Class对象。因此使用==可以实现两个类对象比较的操作

利用反射分析类的能力

API函数举例

  • getDeclaredFields():获得此类对象所表示的类或接口所声明的所有字段。
  • getDeclaredMethods():获得此类对象所表示的类或接口所声明的所有方法,包括公共、保护、私有但不包括继承。
  • getDeclaredConstructors() :返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
  • getName():获得此class所表示实体的名称。

在运行时使用反射分析对象

API函数举例

  • setAccessible(boolean flag):为反射对象设置可访问标志。为true使得对象的私有属性也可以被查询和设置。
  • getField(): 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
  • get(Object obj):返回对象中用Field对象表示的域值。
  • set(Object obj,Object newValue):用一个新值设置Obj对象中的Field对象表示的域。

实例演示

利用反射调用任意方法

API函数说明

public Object invoke(Object obj,Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException 
  • 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
  • 如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
  • 如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
  • 如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。
  • 如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。
  • 如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
参数:
obj - 从中调用底层方法的对象
args - 用于方法调用的参数
返回:
使用参数 args 在 obj 上指派该对象所表示方法的结果
抛出:
IllegalAccessException - 如果此 Method 对象强制执行 Java 语言访问控制,并且底层方法是不可访问的。
IllegalArgumentException - 如果该方法是实例方法,且指定对象参数不是声明底层方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。
InvocationTargetException - 如果底层方法抛出异常。
NullPointerException - 如果指定对象为 null,且该方法是一个实例方法。
ExceptionInInitializerError - 如果由此方法引起的初始化失败

转载于:https://www.cnblogs.com/MrSaver/p/8343828.html

Java基础教程:反射基础相关推荐

  1. Axure RP 9 基础教程 元件基础1

    Axure RP 9 for Mac是一款非常专业的交互原型设计软件,它能让用户快速创建应用软件或Web网站的线框图.流程图.原型和规格说明文档.今天小编给大家带来的是Axure RP 9 基础教程 ...

  2. 视频教程-快速入门Python基础教程_Python基础知识大全-Python

    快速入门Python基础教程_Python基础知识大全 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即 ...

  3. After Effects CC 2019 Essential Training: The Basics After Effects CC 2019基础教程:基础知识 Lynda课程中文字幕

    After Effects CC 2019 Essential Training: The Basics 中文字幕 After Effects CC 2019基础教程:基础知识 中文字幕After E ...

  4. Adobe Dimension Essential Training: The Basics Adobe Dimension 基础教程:基础知识 Lynda课程中文字幕

    Adobe Dimension Essential Training: The Basics 中文字幕 Adobe Dimension 基础教程:基础知识 中文字幕Adobe Dimension Es ...

  5. 视频教程-快速入门Python基础教程_Python基础进阶视频-Python

    快速入门Python基础教程_Python基础进阶视频 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥199.00 立 ...

  6. java 基础教程 ppt_java基础教程课件.ppt

    java基础教程课件 第三章 运算符,表达式和语句 3.1运算符与表达式 3.2 语句的概述 3.3 控制语句 3.4循环语句 3.5break 和continue语句 3.1运算符与表达式 3.1. ...

  7. Java中的反射基础及其应用场景

    1.基础 1.反射的定义: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的 ...

  8. python基础教程pdf-python基础教程第三版.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspPython python基础教程第三版.pdf689页 本文档 ...

  9. sql基础教程mysql_SQL基础教程(第2版)笔记整理

    花了一段时间把SQL基础教程(第2版)看完,并把笔记整理好. 数据定义语言(Data Define Language) 数据操作语言(Data Manipulation Language) 数据控制语 ...

  10. javascript基础教程_JavaScript基础教程(九)对象、类的定义与使用

    对象.类的定义与使用 对象与类是面向对象程序设计语言教学过程中不可避免需要讲解的内容之一.很多人将两者混为一谈,简单认为对象就是类,类就是对象.实际上深入分析的话,对象与类的区别还是较为明显的.本文主 ...

最新文章

  1. list_for_each_safe
  2. 你还有学了三年建模的朋友吗?他有救了
  3. [转]PCB 设计中敷铜的注意事项
  4. Keras【Deep Learning With Python】Autoencoder 自编码(看不懂你打我系列!)
  5. nginx---ngix虚拟主机配置实例
  6. Leetcode-595. 大的国家
  7. 怎么在大学当院系负责人呢?一个case study
  8. 电子工程可以报考二建_毕业证上财务管理专业,可以报考二建吗?
  9. docker ubuntu 文件同步_Docker 的数据管理--Docker从入门到精通摘记
  10. make Image uImage与zImage的区别
  11. mysql数据库服务器名_mysql数据库服务器名
  12. mysql索引优化笔试题_索引优化策略面试题
  13. 系统变量之System.getenv()和System.getProperty()
  14. 谷歌浏览器F12快速定位网页上组件信息
  15. edge浏览器怎么设置html5,win10怎么把edge浏览器设置为默认浏览器方法
  16. java实训项目总结
  17. “神舟八号”飞船将瞄准11月1日5时58分发射
  18. 语音识别工具Sphinx4
  19. Go函数和方法的区别
  20. 怎么把Epub转换成PDF格式?分享两种简单好用的转换方法

热门文章

  1. 红黑树(一)之 原理和算法详细介绍---转帖
  2. 移动网站用backbone还是angular?
  3. dispatch_async 与 dispatch_get_global_queue
  4. Kotlin学习入门笔记
  5. C++实现平衡二叉树
  6. Mybatis的xml配置备忘
  7. VB6 XArrayDB | Xarray ReDim 用法
  8. 多维数据查询效率分析(1)
  9. jbpm 4.4 表结构
  10. spring 事件监听