展开

关键词

java字节

我们都知道Java字节是JVM所使用的指令集。java字节可以分为如下几类: 操作数栈   Java 方法的栈桢分为操作数栈和局部变量区。 如下代码生所的字节: ? dup pop 指令常用于舍弃调用指令的返回结果。 Idc加载常量池中的例子 将局部变量区的值加载到操作数栈的指令   Java 虚拟机将局部变量区当成一个数组,依次存放 this 指针(仅非静态方法),所传入的参数,以及字节中的局部变量。 局部变量表的字节 iinc M, N指令,(其中 M为正整数,N为整数),用于操作局部变量区。 字节如下图所示: ? iinc例子 Java 相关指令 new: 后跟目标类,生成该类的未初始化的对象。

83720

Java字节

Java字节对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。每一个Java字节指令是一个byte数字,并且有一个对应的助记符。 char[] cs,short[] s) { System.out.println(s[0]); System.out.println(cs[0]); } 编译后的字节为 public 我们来看这样一段java代码 public void print(char[] cs,int[] s) { int i,j,k,x; x = 99; s[0] = 77; } 编译后字节如下 代码 public void print(int i) { Object obj = new Object(); obj.toString(); } 编译后的字节如下 Constant 对象/数组操作指令 Java是面向对象的程序设计语言,虚拟机平台从字节层面就对面向对象做了深层次的支持。

16620
  • 广告
    关闭

    90+款云产品免费体验

    提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

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

    Java字节简介

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

    6210

    Java字节修改 - javassist

    AOP的实现一般使用了动态代理和字节修改,本文介绍使用javassist实现类的创建和修改 添加依赖 <dependency> <groupId>org.javassist</groupId > <artifactId>javassist</artifactId> <version>3.28.0-GA</version> </dependency> 使用字节创建一个类 初始化 Method printName = person.getClass().getMethod("printName"); printName.invoke(person); 输出 miao~ mark 使用字节修改类 student = new Student(); student.greeting(); 输出 before greeting~ hello student after greeting~ 常见问题 字节修改类没有生效 需要调用修改的类CtClass.toClass,把修改的信息写入到类字节 attempted duplicate class definition for name: "XXX" 因为对应的类信息已经加载

    43210

    Java字节增强探秘

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

    1.1K51

    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 差不多,但是使用简单。很多开源框架都在使用它。 这就是我们生成的字节文件内容。

    10510

    Java 动态字节技术

    动态生成字节 我们知道,我们编写的 Java 代码都是要被编译成字节后才能放到 JVM 里执行的,而字节一旦被加载到虚拟机中,就可以被解释执行。 字节文件(.class)就是普通的二进制文件,它是通过 Java 编译器生成的。 当然,它的使用门槛也很高,使用它需要对 Java字节文件有所了解,熟悉 JVM 的编译指令。 Instrument ---- 介绍 字节是修改完了,可是 JVM 在执行时会使用自己的类加载器加载字节文件,加载后并不会理会我们做出的修改,要想实现对现有类的修改,我们还需要搭配 Java 的另一个库 参考: 教你用Java字节做点有趣的事 Java Instrument原理 Java Platform Debugger Architecture Structure Overview

    1.3K20

    Java字节增强探秘

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

    42920

    Java字节与反射机制

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

    21010

    java环境修改字节

    原文链接:https://yzddmr6.tk/posts/node-edit-java-class/ 需 求 在蚁剑改造计划之实现JSP一句话中,当时为了解决硬编码字节的问题采用了额外参数的方式来传参 例如 POST: ant=xxxxxxxxxxxxxxx&var1=/bin/bash&var2=whoami 蚁剑没有java环境,所以没办法像冰蝎一样调用asm框架来修改字节。 这个要从字节的结构说起。 Java字节结构 这里以As_Exploits中的jsp反弹shell的payload为例 import java.io.*; import java.net.Socket; public class 用010editor打开编译后的字节文件查看。 ? 最开始的CAFEBA最开始的CAFEBABE叫做魔数,用来标志这是一个字节文件。BE叫做魔数,用来标志这是一个字节文件。 ?

    27140

    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文件跟字节有什么关系呢?

    57031

    java文件到字节

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

    34620

    Java 进阶之字节剖析

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

    19210

    Java 虚拟机字节指令

    Class 文件结构 class 文件是一组以 8 位字节位基础单位的二进制流,采用一种类似 C 语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表。 无符号数属于基本的数据类型,以 u1、u2、u4、u8 分别代表1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或 utf-8 编码构成的字符串值。 为了便于读者理解,在此,我们先来看一个实例,Java 源码如下: publicclassTest{ privateString attribute_1; privateInteger attribute publicvoidtestMethod_1(){ }publicStringtestMethod_2(String param){ returnparam; }} 通过命令“javac Test.java ”编译后,可以得到 Test.class 文件,这就是所谓的字节文件,Test.class 内容如下所示: cafebabe00000032001807000201001e636f6d2f746573742f646f632f6578702f546573

    7620

    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类型的常量值压入操作数栈顶。

    7410

    基于字节Java代码审计

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

    7420

    第16次文章:Java字节

    在上一期讲解java的动态性的时候,我们主要提到了java中的反射机制,可以在java代码运行的时候,改变类的结构,属性等信息,而这一节我们通过另一种实现方式来讲解java的动态性,主要就是java字节操作 其实,计算机并不是直接使用我们程序员编写好的源代码进行执行,而是在我们点击“run”按钮之后,计算机首先是对源代码(.java)文件进行编译操作,将我们写好的源代码.java文件编译成为字节.class 所以说,我们的java虚拟机执行的是字节文件。并且,不论该字节文件来自于哪里,也不论字节文件使用的是哪一种编辑器,只要其符合java虚拟机的要求,都可以被执行。 2、简介 (1)编译器将java源码编译成符合java虚拟机规范的字节文件 (2)字节内部不包含任何分隔符区分段落 (3)一组8位字节单位的字节流组成了一个完整的字节文件 3、操作字节的几个功能 (2)ASM:是一个轻量级java字节操作框架,直接涉及到JVM底层的操作和指令。

    25660

    了解一下Java字节

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

    42430

    使用intellij idea 查看Java字节

    最近在研究 jvm ,需要查看字节. 整理使用intellij idea 查看Java字节 使用方式如下: ? ? 内容参考: Program: /Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/bin/javap Arguments:

    37920

    扫码关注腾讯云开发者

    领取腾讯云代金券