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反射机制 的相关文章

随机推荐

  • 版本记录总结

    对构建中使用的版本进行记录
  • 【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 程序正常执行结束