java反射机制

2023-11-01

1,类加载机制:启动JVM,加载字节码。

当调用java命令来运行某个java程序时。该命令将会启动一个JVM进程,同一个JVM中的所有程,变量都处于同一个进程中,共享该JVM的内存区域。

当出现以下情况时,JVM会退出:

1)程序正常执行结束

2)使用System.exit(0)方法

3)出现异常时,没有捕获异常

4)平台强制结束JVM进程

JVM进程一旦结束,该进程中内存中的数据将会丢失

2,类的加载:

类加载是指将类的class文件载入内存中,并为之创建一个java.lang.Class对象,我们称之为字节码对象。

类的加载过程由类的加载器完成,类加载器通常由JVM提供,我们称之为系统类加载器,我们也可以继承ClassLoader类来提供自定义类加载器,不同的类加载器可以实现加载本地字节码文件,jar包中的字节码,通过网络加载字节码。

2,类的连接:

当类被加载进内存之后,系统为之生产一个对应的Class对象,接着把类的二进制数据合并到JRE中

1)验证:检测加载的类是否有正确的内部结构

2)准备:负责为类的static变量分配内存,并设置默认值

3)解析:把类的二进制数据中的符号引用替换为直接引用

3,类的初始化:

在此阶段,JVM负责对类进行初始化,主要对static变量进行初始化

类的初始化包含一下步骤:

1)如果该类还未被加载和连接,则程序先加载并连接该类

2)如果该类的直接父类还未被初始化,则先初始化其父类

3)如果类中的初始语句(静态代码块),则系统依次执行这些初始化语句

什么是反射?

1)对象都有编译类型和运行类型

Object obj = new java.util.Date();

编译类型:Object

运行类型:java.util.Date

需求:通过obj对象调用java.util.Date类中的toLocaleString方法

此时会编译失败,因为编译时检查Object中,没有该方法

 

三种方式获取对象的字节码:

1)使用类名.class获取

2)使用Object类的getClass()方法

3)使用Class类的forName(String className)方法

注意:同一个类在JVM中只存在一份字节码对象,也就是说clz1==clz2==clz3

 

 

 

java.lang.Class九大内置Class实例:

byte,short,int,long,float,double,char,boolean,void

数组的Class实例:

相同维数的同一数据类型的数组共享同一个Class对象

 

获取构造器:

1)获取该类的字节码对象

2)从该字节码对象中去找需要获取的构造器

Class类获取构造器方法:

Constructor类:表示类中构造器的类型,Constructor的实例就是某一个类中的某一个构造器

public Constructor<?>[] getConstructors():获取当前Class所表示的类的public修饰的构造器

 

public Constructor<?>[] getDeclaredConstructors():获取当前类的所有构造器,与访问权限无关

 

public Constructor<?>[] getConstructor(Class<?>...ParameterTypes):获取当前类中指定的一个public的构造器

 

参数parameterTypes表示构造器参数的Class类型

public Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes):获取当前Class所表示类中指定的一个构造器

 

通过获取的构造器创建对象:

1)找到构造器所在类的字节码对象

2)获取构造器

3)使用构造器创建对象

 

通过设置setAccessible(true);使得私有构造器可以访问。

 

注意:不单Constructor有newInstance方法

Class类也有newInstance方法,但是只能调用无参构造方法

使用反射获取类中的方法:

1)获取方法所在类的字节码对象

2)获取方法

常用方法:

public Method[] getMethods():获取包括自身和继承过来的所有public方法

 

public Method[] getDeclareMethods():获取自身所有的方法(不包括继承的,与访问权限无关)

 

public Method getMethod(String methodName,Class<?>...parameterTypes):表示调用指定的一个公共的方法(包括继承的)

参数:

methodName:表示被调用方法的名字

parameterTypes:表示被调用方法的参数的Class类型

 

public Method getDeclaredMethod(String name,Class<?>...parameterTypes):表示调用指定一个本类中的方法(不包括继承的)

参数:

methodName:表示被调用方法的名字

parameterTypes:表示被调用方法的参数的Class类型

使用反射调用方法:

如何使用反射调用一个方法:

在Method中有一个方法:

public Object invoke(Object obj,Object...args):表示调用当前Method所表示的方法

参数:

obj:表示被调用的方法底层所属对象

args:表示调用方法时传递的实际参数

返回:

底层方法的返回结果

调用私有方法:

在调用私有方法前应该设置该方法是可访问的

 

使用反射调用静态方法:

静态不属于任何对象,静态方法属于类本身

此时把invoke()方法的第一个参数设置为null即可

 

当方法需要一个数组参数时:

 

 

String[]这里不行是因为进行了自动解包,导致变成了一个一个的字符串。而不是字符串数组

其他的API:

Class类中:

int getModifiers()获得修饰符

String getName()返回类的全限定名

Package getPackage()获得该类的包

String getSimpleName()获取类的简单名字

Class getSupperclass()获得类的父类

boolean isArray()判断该class实例是否是数组

boolean isEnum()判断class实例是否是枚举

 

Class类,Constructor类,Method类,Filed类

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java反射机制 的相关文章

  • Java selenium - 如何在 TimeoutException 之后正确刷新网页?

    ChromeOptions options new ChromeOptions options addExtensions new File extension 6 2 5 0 crx ZenMate options addExtensio
  • 如何访问EmbeddedSolrServer实例的管理界面?

    在我的网络应用程序中 我正在运行org apache solr client solrj embedded EmbeddedSolrServer出于调试目的 我想访问管理界面 这就是我实例化服务器的方式 new EmbeddedSolrSe
  • Java:等于和==

    让我们看看我们有 2 个对用户定义类实例的引用 即 Java 中的 a 和 b 会不会有一种情况 a b 但 a equals b 返回 false 当然 实施 equals 完全取决于班级 所以我可以写 class Foo public
  • 我从 String placeName = placeText.getText().toString(); 收到空指针异常

    您好 想从编辑文本中获取地名并在地图上标记 这是我的代码 其中出现空指针异常 请帮助我应该做什么以及哪里出错了 因为我从对话框中的编辑文本字段获取地名 View layout View inflate this R layout alert
  • 如何对 jar 文件资源使用 File.separator?

    我正在尝试读取位于 jar 文件中的属性文件 我想使用 File separator 因为应用程序将在多个平台上运行 我正在构建路径如下 jarFilePath jar file jarFile getAbsolutePath jarPro
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • 使用 Microsoft REST API - Java 将 Xbox-Live GamerTag 转换为 XUID

    我有一个 Java 应用程序 它需要能够获取用户输入的 Minecraft Bedrock Edition 玩家标签 并将其转换为给定帐户的 XUID 以便我可以将其存储起来以供稍后列入白名单和参考目的 我一直在浏览 Microsoft R
  • Mockito mockStatic 无法解析符号

    我正在使用 Spring Boot 并在单元测试中 我试图模拟Files delete myFile toPath method 为此 我尝试使用Mockito mockStatic 方法 但是当我尝试使用它时 我的 IDE Intelli
  • 在 Java 中生成 LaTeX 输出 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有用于从 Java 生成 LaTeX 输出的 Java 库 渲染乳胶 JLatex数学 https
  • 对象映射器 - YAMLFactory - 由于缺少 _createContentReference 方法而出现异常

    我正在使用最新的 2 13 0 版本的 jackson 当我尝试解析 YAML 文件时 出现此异常 java lang NoSuchMethodError com fasterxml jackson core io ContentRefer
  • 如何组合 3 个或更多 CompletionStages?

    如果有 2 个 CompletionStages 我可以将它们与thenCombine method CompletionStage a aCompletionStage getA CompletionStage b bCompletion
  • Java:如果数组大小未知,如何初始化?

    我要求用户输入 1 到 100 之间的一些数字并将它们分配到一个数组中 数组大小未初始化 因为它取决于用户输入数字的次数 我应该如何分配数组长度 如果用户输入 5 6 7 8 9 5 个数字 则 int list becomes int l
  • 在实现接口的类上强制使用单例模式

    我最好用一个例子来解释这个问题 我有一个接口模型可用于访问数据 模型可以有不同的实现 可以以各种格式表示数据 例如 XMl txt 格式等 Model不关心格式 可以说这样的一个实现是myxml模型 现在我想强迫myxml模型以及其他所有实
  • @Transactional 注解属于哪里?

    如果您将 Transactional in the DAO类和 或其方法 或者注释使用 DAO 对象调用的服务类是否更好 或者注释两个 层 是否有意义 我认为事务属于服务层 它是了解工作单元和用例的人 如果您将多个 DAO 注入到需要在单个
  • Tomcat下的Spring CXF Soap Web服务:找不到服务

    我正在尝试使用 CXF 和 Spring 设置一个在 Tomcat 上运行的简单 CXF Web 服务 我有一个 Web 应用程序初始化程序来引导 CXF servlet public class WebAppInitializer ext
  • java charAt() 和startsWith() 哪个更快? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题是 如果我想检查特定索引中字符串的一个字符 仅检查一个字符 哪种方法非常有效charAt or startsWith 我的意思是 据我所
  • 图标和导航视图之间的左边距

    我必须在图标和图标之间添加左边距NavigationView 如下图中箭头所示 我知道根据谷歌规范 这个边距必须有16dp但我需要改变它 我努力了
  • Java 执行器和长寿命线程

    我继承了一些使用 Executors newFixedThreadPool 4 的代码运行 4 个长寿命线程来完成应用程序的所有工作 这是推荐的吗 我读过Java 并发实践 https rads stackoverflow com amzn
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • Selenium Webdriver - 单击多个下拉菜单时出现陈旧元素异常,而 HTML DOM 不会更改

    我尝试自动化一个场景 其中条件是我必须从下拉列表中选择一个选项 然后它旁边有另一个下拉列表 我必须单击下一个下拉列表中的一个选项才能启用按钮 我尝试使用代码 但它仅单击第一个选项 并显示错误为过时的元素引用 元素未附加到页面文档 请帮忙 如

随机推荐

  • 版本记录总结

    对构建中使用的版本进行记录
  • 【vue】this.$router.replace跳转不起作用 Router push or replace not working

    项目场景 商城APP底部导航切换对应页面 问题描述 提示 这里描述项目中遇到的问题 Just sit there clicking the home btn watching log show me home but never getti
  • Git远程库代码回退

    一 首先认识两个回退过程中很重要的命令 1 git log 显示所有提交过的版本信息 不包括已经被删除的 commit 记录和 reset 的操作 空格向下翻页 b 向上翻页 q 退出 git log pretty oneline git
  • 华为od机试 C++ 【计算最少步数】

    题目 小明计划在周末去爬山 他有一份包含山峰高度的地图 其中 0 代表平地 而 1 到 9 表示不同的山峰高度 小明可以向上 下 左或右移动一步 但是 由于他不想爬得太累 他决定只在高度差不超过 k 的地方移动 现在他站在地图的左上角 你能
  • 做好五年不跳槽的准备

    入职半年了 我觉得这里可以长久发展 其一 工作能胜任 我感觉找回自信了 甚至有些傲娇了 说明osg确实比较对口 做擅长的工作 会越做越有信心 其二 老大靠谱 老大十几年经验 并且很有耐心 工作方式也对 比如 先给你代码 在这个基础上改 并且
  • 超长整数相加

    链接 https www nowcoder com questionTerminal 5821836e0ec140c1aa29510fd05f45fc orderByHotValue 1 mutiTagIds 640 643 page 6
  • Python数据挖掘 数据预处理案例(以航空公司数据为例)

    Python数据预处理 一 内容 1 数据清洗 2 数据集成 3 数据可视化 二 实验数据 根据航空公司系统内的客户基本信息 乘机信息以及积分信息等详细数据 依据末次飞行日期 LAST FLIGHT DATE 以2014年3月31日为结束时
  • go build遇见“module *** found, but does not contain package ***”

    在实际项目中编译版本时遇见以下问题 common middleware sentinel go 4 2 module github com alibaba sentinel golang latest found v1 0 2 but do
  • SSH项目所需jar包下载地址

    struts2下载地址 http pan baidu com s 1c0joXbi hibernate下载地址 http pan baidu com s 1c0ues1a spring下载地址 http pan baidu com s 1b
  • JS学习篇(一)—— 数据类型篇

    JS学习篇 一 数据类型篇 JS的有八种数据类型 七种基本类型 undefined null Boolean number string symbol bigint 一种引用类型 object 七种基本类型 1 undefined 定义 通
  • (新)关于修改window.navigator.webdriver代码失效问题

    文章目录 前文回顾 溯源追根 解决方案 新登陆代码 写在最后 前文回顾 前面写过两篇关于sycm自动化爬取的文章 关于抓取代码的文章链接 出师未捷身先死的sycm数据自动化 关于chrome版本迭代后 代码失效问题解决方案的文章链接 关于修
  • mysql8.0一 服务启动

    声明 本文 禁止转载 本文所有观点和概念都系个人总结 难免存在疏漏之处 为不至于诱导初学者误入歧途 望各位以自己实践为准 特此声明 如有错误请告知 启动 流程 windows 7系统 创建data空目录 创建my ini文本文件 内容如下
  • Mac如何通过Xcode安装GCC编译器 How to install gcc on mac with xcode

    什么是GCC GCC GNU Compiler Collection 是由自由软件基金会 FSF Free Software Foundation Inc 研发的开源编译器集合 用一句话说 GCC就是除Windows以外的平台上使用最广的编
  • Java反射copy对象源到目标

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 使用反射机制 二 使用步骤 1 引入库 2 Copy数据 3 Fields 自定义注解 总结 前言 例如 随着很多流行的框架出现 反射也成了其中必不可少的
  • 【项目实战】Python实现循环神经网络SimpleRNN、LSTM进行淘宝商品评论情感分析(含爬虫程序)

    说明 这是一个机器学习实战项目 附带数据 代码 如需数据 完整代码可以直接到文章最后获取 1 项目背景 随着信息化社会的发展 互联网成为方便 快捷的信息获取渠道之一 在电子商务和社会网站中 大量非结构化的评论文本作为最直观的用户体验数据被保
  • 机器学习之k 均值聚类教程(代码实战,详解核心算法)

    k 均值聚类 1 引入依赖 import numpy as np import matplotlib pyplot as plt 调用sklearn中的方法直接生成数据 from sklearn datasets samples gener
  • vue2 ElementUI 表单标签、表格表头添加问号图标提示

    文章目录 1 问题背景 2 element ui悬浮提示定义 3 基础 4 延申 5 参考 1 问题背景 使用element ui有时候需要对表格的表头 表单的标签进行自定义 添加问号的悬浮提示 要达到的效果 如图所示 2 element
  • stmmac ethernet

    学习笔记 网卡驱动 从这里看起stmmac register platform 注册一个平台驱动 const struct stmmac of data meson dwmac data setup meson dwmac setup fi
  • 递归与递归算法实例(java实现)

    一 递归介绍 递归算法 英语 recursion algorithm 在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法 绝大 多数编程语言支持函数的自调用 在这些语言中函数可以通过调用自身来进行递归 定义 一个方法在执
  • java反射机制

    1 类加载机制 启动JVM 加载字节码 当调用java命令来运行某个java程序时 该命令将会启动一个JVM进程 同一个JVM中的所有程 变量都处于同一个进程中 共享该JVM的内存区域 当出现以下情况时 JVM会退出 1 程序正常执行结束