首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java字节反射机制

字节(Byte Code)是Java语言跨平台特性的重要保障,也是反射机制的重要基础。...通过反射机制,我们不仅能看到一个类的属性和方法,还能在一个类里调用另外一个类的方法,但前提是我们得有相关类的字节文件(也就是.class文件)。...1 字节和.class文件 当我们编写好以.java为扩展名的文件后,如果它能被运行(比如其中包含main函数),那么我们能通过点击MyEclipse里的运行按钮运行这个.java文件。...但此时,MyEclipse向我们隐藏了一个关键步骤:它首先是把.java文件编译成扩展名是.class的字节文件,随后,Java的虚拟机(JVM)是在当前的操作系统上(比如window 10)上运行这个...有些偏题了,回到反射这个话题上,只要我们能得到.class这个字节文件,那么通过反射机制我们不仅能看到这个.class所对应java文件里的属性方法等信息,而且还能调用它所对应java文件里的方法。

69010
您找到你想要的搜索结果了吗?
是的
没有找到

Java字节简介

中,而jvm要运行java代码首先要做的就是加载字节,也就是.java文件经过编译变成的.class文件。...jvm运行的指令就是.class字节。所以通过学习字节的规范和规则能提升我们对代码执行过程的理解。 这里恶补一下字节相关的基础知识。 我们打开.class文件,发现字节都是十六进制的编码。...1.魔数:如图所示,cafebabe就是java字节的魔术,这个数字是用java之父,詹姆斯高斯林指定的,其含义 就是java的咖啡bean吧。...2.版本号:因为java有不同的版本,所以在java字节中也有标记。0000 0034两个字节就表示java1.8版本。..." 总结:java通过编译将源文件编译为字节文件,其字节中方法的执行和常量池和代码区有很大的联系。

87410

Java字节增强探秘

因此,也可以看出字节对于Java生态的重要性。之所以被称之为字节,是因为字节文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。...在Java中一般是用javac命令编译源代码为字节文件,一个.java文件从编译到运行的示例如图1所示。 ?...图1 Java运行示意图 对于开发人员,了解字节可以更准确、直观地理解Java语言中更深层次的东西,比如通过字节,可以很直观地看到Volatile关键字如何在字节上生效。...本文重点着眼于字节增强技术,从字节开始逐层向上,由JVM字节操作集合到Java中操作字节的框架,再到我们熟悉的各类框架原理及应用,也都会一一进行介绍。...1.3 字节操作集合 在上图13中,Code区的红色编号0~17,就是.java中的方法源代码编译后让JVM真正执行的操作

1.8K51

Java 字节操作示例

Java 动态性的两种常见实现方式 (1)字节操作 (2)反射 运行时操作字节可以让我们实现如下功能: (1)动态生成新的类 (2)动态改变某个类的结构(添加/删除/修改 新的属性/方法...) 优势 (1)比反射开销小,性能高 (2)Javassist 性能高于反射,低于ASM 常见的字节操作类库 BCEL Byte Code Engineering Library(BCEL...ASM 是一个轻量级 Java 字节操作框架,直接涉及到 JVM 底层的操作和指令 前两个效率最高,学起来也较难 CGLIB(Code Generation Library) 是一个强大的...Javassist 是一个开源的分析、编辑和创建 Java 字节的类库。性能较 ASM 差,跟 cglib 差不多,但是使用简单。很多开源框架都在使用它。...这就是我们生成的字节文件内容。

83810

Java字节增强探秘

因此,也可以看出字节对于Java生态的重要性。之所以被称之为字节,是因为字节文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。...在Java中一般是用javac命令编译源代码为字节文件,一个.java文件从编译到运行的示例如图1所示。 ?...图1 Java运行示意图 对于开发人员,了解字节可以更准确、直观地理解Java语言中更深层次的东西,比如通过字节,可以很直观地看到Volatile关键字如何在字节上生效。...本文重点着眼于字节增强技术,从字节开始逐层向上,由JVM字节操作集合到Java中操作字节的框架,再到我们熟悉的各类框架原理及应用,也都会一一进行介绍。...1.3 字节操作集合 在上图13中,Code区的红色编号0~17,就是.java中的方法源代码编译后让JVM真正执行的操作

1K20

Java 动态字节技术

随着对 Java 的愈加熟悉,我也了解了反射字节等技术,直到前些天的周会分享,有位同事分享了 Btrace 的使用和实现,提到了 Java 的 ASM 框架和 JVM TI 接口。...动态生成字节 我们知道,我们编写的 Java 代码都是要被编译成字节后才能放到 JVM 里执行的,而字节一旦被加载到虚拟机中,就可以被解释执行。...字节文件(.class)就是普通的二进制文件,它是通过 Java 编译器生成的。...当然,它的使用门槛也很高,使用它需要对 Java字节文件有所了解,熟悉 JVM 的编译指令。...Instrument ---- 介绍 字节是修改完了,可是 JVM 在执行时会使用自己的类加载器加载字节文件,加载后并不会理会我们做出的修改,要想实现对现有类的修改,我们还需要搭配 Java 的另一个库

2K20

字节角度—— 看synchronized和反射的实现原理

今天我们回到Java本身, 看下我们常用的synchronized关键字和反射字节层面是如何实现的. synchronized 代码块级别的 synchronized 如下方法的内部使用了synchronized...这也是字节中,只有一个 monitorenter 却有两个 monitorexit 的原因 可理解为这样的一段 Java 代码 public void _foo() throws Throwable...反射Java反射随处可见,它底层的原也比较有意思,这篇文章来详细介绍反射背后的原理。...如果反射仅调用一次的话,采用生成字节的方式反而比 native 调用的方式慢 3 ~ 4 倍。...小结 这篇文章主要从字节角度看了Java中的synchronized和射调用底层的原理,当然还有一些其他比较有意思的语法比如lambda, switch等, 感兴趣的小伙伴也可以从字节角度去了解一下

10920

Java 字节操作框架——ASM

大家好我是小悦,之前的文章我们介绍了字节的基础知识,今天我们将介绍字节相关的应用场景,首先要介绍的是如何对字节做解析和修改,本文将会详细给大家介绍一个工业级字节操作框架 ASM。...ASM 当我们需要对一个 class 文件做修改时,我们可以选择自己解析这个class 文件,在符合 Java 字节规范的前提下进行字节改造。...方法中对字节进行修改,ClassWriter 可以生成最终修改过的自己字节。...ASM 操作字节案例 接下面我们用几个简单的例子来演示 ASM 各个核心类操作字节的案例。...小结 这篇文章我们主要讲解了 ASM 字节操作框架,一起来回顾一下要点: 第一,ASM 是一个久经考验的工业级字节操作框架。

25020

Java字节深度知多少?

Java真的是长盛不衰,拥有顽强的生命力。其中,字节机制功不可没。字节,就像是 Linux 的 ELF。有了它,JVM直接摇身一变,变成了类似操作系统的东西。...这部分内容枯燥乏味,关于它的细节在Java的官方都能非常容易的找到。 如下图,展示了一个简单方法的字节描述,我们可以看到真正的执行指令在整个文件结构中的具体位置。...参考Java的类加载机制,在class文件被加载到方法区以后,就完成了从符号引用到具体地址的转换过程。 我们可以看一下编译后的main方法字节。尤其需要注意的是对于接口方法的调用。...但是我们可以使用一些外部的字节修改工具,比如ASM,来生成一些带有这个指令的字节,这通常能够完成一些非常酷的功能,比如完成一门弱类型检查的JVM-Base语言。...END 本文从Java字节的顶层结构介绍开始,通过一个实际代码,了解了类加载以后,在JVM内存里的表现形式,并了解了jhsdb对Java进程的观测方式。

4210

java字节byte code简介

简介 Byte Code也叫做字节,是连接java源代码和JVM的桥梁,源代码编译成为字节,而字节又被加载进JVM中运行。...字节怎么生成,怎么查看字节,隐藏在Byte Code背后的秘密是什么呢?快跟小师妹一起来看看吧。 Byte Code的作用 小师妹:F师兄,为什么Java需要字节呢?...小师妹你这个想法很好,这种实现有个专业的说法叫做:Java processor。 Java processor就是用硬件来实现的JVM。因此字节可以直接在Java processor中运行。...为了提升java在手机端的执行速度。 但是这样做其实也是有缺点的,后面我们会讲到,java字节中的指令非常非常多。所以如果用硬件来实现的话,就会非常非常复杂。...一般来说Java processor不会实现全部的字节中的功能,只会提供部分的实现。 查看Byte Code字节 小师妹:F师兄,那使用javac编译过后的class文件跟字节有什么关系呢?

1.3K31

java文件到字节

本文来说一下,我们开发好的.java文件是源码文件,并不能交给机器直接执行,需要将其变成字节甚至是机器文件。那么静态编译器是如何把源码转化成字节的呢? 下图为.java源码转化为字节的过程。...词法解析就是通过空格分隔出单词、操作符、控制符等信息,将其形成token信息流,传递给语法解析器;在语法解析时,把词法解析得到的token信息流按照Java语法规则组装成一个语法树。...当语义分析完成之后,即可以生成字节字节必须通过类加载过程加载到JVM环境中后,才可以执行。...字节执行的三种模式 解释执行 JIT编译执行 JIT编译与解释混合执行(主流JVM默认模式) 何为JIT编译?...JIT的作用就是将Java字节动态低编译成可以直接发送给处理器指令执行的机器。大致流程如下: ? 注意:解释执行与编译执行在线上环境微妙的辩证关系。

92120

Java 进阶之字节剖析

内功有不少帮助,记得得文末点赞支持一下哦 ^_^ Java 系列大纲如下: 本篇我们先来学习下字节 ,毕竟这是 Java 能跨平台的根本原因,而且通过了解字节也可以彻底揭开 JVM 运行程序的秘密...来说,则首先由编译器将源文件编译成字节,再在运行时由虚拟机(JVM)解释成机器指令来执行,我们可以看下下图 也就是说 Java 的跨平台其实是通过先生成字节,再由针对各个平台实现的 JVM 来解释执行实现的...规范的字节再由 JVM 执行,不知你是否注意到,使用字节也利用了计算机科学中的分层理念,通过加入字节这样的中间层,有效屏蔽了与上层的交互差异。...Java 字节技术简介 注意线程中还有一个「PC 程序计数器」,是每个线程独有的,记录着当前线程所执行的字节的行号指示器,也就是指向下一条指令的地址,也就是将执行的指令代码。...,指令=操作+操作数,操作码表示这条指令要做什么,比如加减乘除,操作数即操作操作的数,比如 1+ 2 这条指令,操作其实是加法,1,2 为操作数,在 Java 中每个操作都由一个字节表示,每个操作都有对应类似

83310

JAVA字节到方法运行

是利用Java运算符顺序将式子拆解,然后一步步运算,还是其他什么办法?在思索一会儿之后,决定还是通过字节指令来看看这两行代码是怎么运行的。...将两行代码拷贝到Test.java中,执行以下指令输出字节: javac Test.java javap -c Test.class 字节输出结果如下: 如果是之前对字节没有了解的话,可以去搜一下字节指令的资料...,或者去《深入理解Java虚拟机》这本书去找附录b 字节指令表。...接下来翻译一下字节: public static void main(java.lang.String[]); Code: 0: iconst_1 // 将1放入操作数栈顶...但是不同的是,在给a、b赋值时候字节指令是bipush,是将单字节的整型常量值(-128 - 127)压入操作数栈顶;给c、d赋值时候字节指令是sipush,是将int类型的常量值压入操作数栈顶。

45510

基于字节Java代码审计

基于字节Java代码审计 之前看了基于字节Java代码审计工具的实现,最近终于有空可以好好看一下其是如何实现的了。本文并不会从代码出发,而是试图从字节角度分析其可行性。...JVM简介 要了解字节首先需要对JVM有所了解,Java虚拟机并不关心Java语言,它只和字节相关联,这一方面使得Java程序可以Run AnyWhere,另一方面也为其运行其他语言提供了支持 --...只要编译成为符合字节规范的内容,均可以在Java虚拟机中运行。...实现 上文已经找到了字节代码审计的关键,那接下来如何通过代码去实现呢?首先第一个问题,如何将Class文件解析成字节指令的形式。...这里就不得不提一下ASM了,作为字节增强技术,它可以动态修改字节或者是遍历类的结构,ASM此处就不进行深入展开了,我们单单看一下遍历类结构这一点,它会按照一定顺序逐语句对字节进行解析,当解析到函数时我们就可以自定义一个局部变量表以及操作数栈来进行模拟操作

71020

jdk动态代理(动态生成字节反射机制的结合)

java jdk动态代理其实是动态生成字节反射机制的一个结合,说到反射机制很多人都用到过反射,只要得到对应类的Class对象即可,调用方法,获取成员变量等等,那么jdk的动态代理就是在程序运行的过程中...而动态生成字节是一种技术,就是在编译期不能决定要生成字节的类型,也就是没有对应的java文件,所以就不能生成class文件,像是静态代理的话,我们会明确的实现一个代理类,所以可以在编译期生成字节文件...,但是动态代理不会明确实现某一个类的代理类,是针对所有业务类的一个公用的类,由于在编译期不能决定生成那个业务类的代理类所以就不能生成字节,反而是在运行的时候,看我们传入的实例是输入什么类的,生成对应类的代理类...,因为这时候要确定生成一个代理类 ,如果没有字节文件,那么该类就不会加载,更加不会执行,所以动态代理技术,会把字节文件动态的拼接出来,形成一个class文件,这就是动态生成字节的文件。...,第三个参数是我们上面实现类(InvocationHandler)的实例,那么这个方法,返回的就是一个代理类,就是在这个方法中,动态拼接处代理类的字节

41920

了解一下Java字节

" 3.3 jclasslib 图形化的字节阅读器。...Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。...2 字节与数据类型 对于大部分与数据类型相关的字节指令,它们的操作助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表对int类型的数据操作,l代表long,s代表short,b代表byte...2.4 对象创建与访问指令 虽然类实例和数组都是对象,但Java虚拟机对类实例和数组的创建与操作使用了不同的字节指令。...而在Java虚拟机中,处理异常(catch语句)不是由字节指令来实现的,而是采用异常表来完成的。

1.4K30
领券