-
2019-12-03 15:31:40
public static void main(String[] args)throws Exception { String msg="汉字"; byte[] bytes=msg.getBytes("utf-8"); String ms=new String(bytes,0,bytes.length,"utf-8"); System.out.print(ms); }
源数据是utf-8那么你接收后,依然要按原格式utf-8进行转换才可以。
更多相关内容 -
Java字节码转换工具—Retrotranslator
2020-03-04 12:43:37Retrotranslator的网站位于...通过该工具进行转换,可以完美的运行在java14环境下面。当 然,该工具也不是完全可以兼容jdk15的新功能,在其网站上面也谈及了不能够实现的部分,可以作为参考。 -
JVML-JIT:JVML的延续,它将JIT将Java字节码转换为Lua字节码,而不是进行解释
2021-05-08 14:45:49JVML的延续,它将JIT将Java字节码转换为Lua字节码,而不是进行解释。 由ds84182提供的原始代码库。 要求 需要Ant来构建JVML的运行时库(cc_rt.jar) 要编译Java源文件并确保针对CCLib运行时进行正确的检查,而不是... -
java图书馆swing源码-cheerpj-meta:CheerpJ-将Java字节码转换为WebAssembly和JavaScript
2021-06-05 17:09:17字节码,与 Java 100% 兼容,允许将任何 Java SE 应用程序、库或 Java 小程序编译成 WebAssembly/JavaScript 应用程序。 最新版本: 最新运行时链接: https://cjrtnc.leaningtech.com/2.2/loader.js : ... -
java字节码框架ASM操作字节码的方法浅析
2020-08-31 14:35:51主要给大家介绍了关于java字节码框架ASM如何操作字节码的相关资料,文中通过示例代码介绍的很详细,有需要的朋友可以参考借鉴,下面来一起看看吧。 -
voc:一个将Python代码转换为Java字节码的编译器
2021-04-12 12:59:32一个将Python代码转换为Java字节码的编译器。 这是实验代码。 如果破裂,您将保留所有闪亮的碎片。 它能做什么: 提供一个API,可让您以编程方式创建Java类文件。 将Python 3.4源文件编译为Java类文件,使您... -
jitwatch java字节码编译工具 可以将字节码转换成汇编语言
2022-01-04 19:55:34不需要下载源码编译执行,可以直接运行jar文件 运行命令:java -jar jitwatch.jar -
从0到1 Android安全学习之路 -- Java 字节码和 Dalvik 字节码
2021-11-13 18:01:11Java 字节码和 Dalvik 字节码概述源代码样例Java 字节码Dalvik 字节码总结 概述 本篇博客将讲述 Java 源代码到字节码,字节码转汇编,以及 Android 中 Java 源代码转 Dalvik 字节码,Dalvik 字节码转 smali 汇编...Java 字节码和 Dalvik 字节码
概述
本篇博客将讲述 Java 源代码到字节码,字节码转汇编,以及 Android 中 Java 源代码转 Dalvik 字节码,Dalvik 字节码转 smali 汇编的一些操作。主要是熟悉一些基本工具的使用,这里做个总结。
源代码样例
这里提供一份最简单的源代码示例,示例在于精而不在于复杂,当然肯定越简单越好,将下面的代码保存为
HelloWorld.java
文件,后面转 Java 字节码和 Dalvik 字节码都用该示例。public class HelloWorld { public static void main(String[] args) { System.out.println("HelloWorld!"); } }
Java 字节码
Java 源代码转字节码,使用 jdk 自带命令行工具
javac
,如下命令所示。执行后会在当前目录下生成HelloWorld.class
文件,这里生成 .class 文件就是 Java 字节码,可以交由 Java 虚拟机(JVM)执行,操作命令如下java HelloWorld
。javac HelloWorld.java
如果直接打开字节码文件,中间会有一些乱码,人无法直接阅读,所以这里借用 jdk 自带命令行工具
javap
执行反汇编,将字节码转为汇编代码。如下命令所示,这里操作的是HelloWorld.class
,命令行中是否加上 .class 后缀都可以。javap -c HelloWorld
如下代码所示,是上面执行后的输出结果,这里注意该命令并不会将汇编代码写入到本地文件中,如果需要写入到指定文件请借助重定向符号,操作命令如下
javap -c HelloWorld > HelloWorld
。Compiled from "HelloWorld.java" public class HelloWorld { public HelloWorld(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3 // String HelloWorld! 5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return }
Dalvik 字节码
Dalvik 虚拟机(DVM)是 Google 专门用来运行 Android 程序的虚拟机,因此 Android 程序上的 Java 代码最终都会被编码为 Dalvik 字节码,并在经过一些处理后打包为 DEX 可执行文件,此时就可以由 DVM 解释运行。在 Android 4.4 版本后又引入了 ART(Android RunTime)虚拟机,ART 完全支持兼容 DEX ,因此学习 Dalvik 是一个基础 。
Java 源代码转 DEX。首先我们需要得到 Java 源代码对应的字节码文件,使用上面的命令即可,然后再使用 sdk 提供的工具 dx ,该工具位于 sdk 的 /build-tools 目录中。dx --dex --output=HelloWorld.dex HelloWorld.class
DEX 可执行文件转 smali 汇编。这里使用 baksmali.jar 工具,位于 sdk 的 /tools/lib 中。
baksmali.jar HelloWorld.dex
执行该命令后,会在当前目录下生成 out 文件夹,里面会有
HelloWorld.smali
文件。该文件内容如下。.class public LHelloWorld; .super Ljava/lang/Object; .source "HelloWorld.java" # direct methods .method public constructor <init>()V .registers 1 .prologue .line 1 invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method .method public static main([Ljava/lang/String;)V .registers 3 .prologue .line 4 sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; const-string v1, "HelloWorld!" invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V .line 5 return-void .end method
总结
不忘初心,砥砺前行!
-
JWebAssembly:Java字节码到WebAssembly编译器
2021-01-31 11:39:07JWebAssembly是编译器的Java字节码。 它使用Java类文件作为输入。 它可以编译任何可编译为Java字节码的语言,例如Clojure,Groovy,JRuby,Jython,Kotlin和Scala。 作为输出,它生成二进制格式(.wasm文件)或文本... -
java字节码文件转汇编文件
2020-10-02 21:46:37 -
Java 执行引擎(从字节码到机器码)
2021-02-25 20:10:01执行引擎以指令为单位读取Java字节码。它就像一个CPU一样,一条一条地执行机器指令。每个字节码指令都由一个1字节的操作码和附加的操作数组成。执行引擎取得一个操作码,然后根据操作数来执行任务,完成后就继续执行...通过类装载器装载的,被分配到JVM的运行时数据区的字节码会被执行引擎执行。执行引擎以指令为单位读取Java字节码。它就像一个CPU一样,一条一条地执行机器指令。每个字节码指令都由一个1字节的操作码和附加的操作数组成。执行引擎取得一个操作码,然后根据操作数来执行任务,完成后就继续执行下一条操作码。
不过Java字节码是用一种人类可以读懂的语言编写的,而不是用机器可以直接执行的语言。因此,执行引擎必须把字节码转换成可以直接被JVM执行的语言。字节码可以通过以下两种方式转换成合适的语言。
解释器:一条一条地读取,解释并且执行字节码指令。因为它一条一条地解释和执行指令,所以它可以很快地解释字节码,但是执行起来会比较慢。这是解释执行的语言的一个缺点。字节码这种“语言”基本来说是解释执行的。
即时(Just-In-Time)编译器:即时编译器被引入用来弥补解释器的缺点。执行引擎首先按照解释执行的方式来执行,然后在合适的时候,即时编译器把整段字节码编译成本地代码。然后,执行引擎就没有必要再去解释执行方法了,它可以直接通过本地代码去执行它。执行本地代码比一条一条进行解释执行的速度快很多。编译后的代码可以执行的很快,因为本地代码是保存在缓存里的。
不过,用JIT编译器来编译代码所花的时间要比用解释器去一条条解释执行花的时间要多。因此,如果代码只被执行一次的话,那么最好还是解释执行而不是编译后再执行。因此,内置了JIT编译器的JVM都会检查方法的执行频率,如果一个方法的执行频率超过一个特定的值的话,那么这个方法就会被编译成本地代码。
图 7:Java编译器和JIT编译器
JVM规范没有定义执行引擎该如何去执行。因此,JVM的提供者通过使用不同的技术以及不同类型的JIT编译器来提高执行引擎的效率。
大部分的JIT编译器都是按照下图的方式来执行的:
图 8: JIT编译器
JIT编译器把字节码转换成一个中间层表达式,一种中间层的表示方式,来进行优化,然后再把这种表示转换成本地代码。
Oracle Hotspot VM使用一种叫做热点编译器的JIT编译器。它之所以被称作”热点“是因为热点编译器通过分析找到最需要编译的“热点”代码,然后把热点代码编译成本地代码。如果已经被编译成本地代码的字节码不再被频繁调用了,换句话说,这个方法不再是热点了,那么Hotspot VM会把编译过的本地代码从cache里移除,并且重新按照解释的方式来执行它。Hotspot VM分为Server VM和Client VM两种,这两种VM使用不同的JIT编译器。
Figure 9: Hotspot Client VM and Server VM.
Client VM 和Server VM使用完全相同的运行时,不过如上图所示,它们所使用的JIT编译器是不同的。Server VM用的是更高级的动态优化编译器,这个编译器使用了更加复杂并且更多种类的性能优化技术。
IBM 在IBM JDK 6里不仅引入了JIT编译器,它同时还引入了AOT(Ahead-Of-Time)编译器。它使得多个JVM可以通过共享缓存来共享编译过的本地代码。简而言之,通过AOT编译器编译过的代码可以直接被其他JVM使用。除此之外,IBM JVM通过使用AOT编译器来提前把代码编译器成JXE(Java EXecutable)文件格式来提供一种更加快速的执行方式。
大部分Java程序的性能都是通过提升执行引擎的性能来达到的。正如JIT编译器一样,很多优化的技术都被引入进来使得JVM的性能一直能够得到提升。最原始的JVM和最新的JVM最大的差别之处就是在于执行引擎。
Hotspot编译器在1.3版本的时候就被引入到Oracle Hotspot VM里了,JIT编译技术在Anroid 2.2版本的时候被引入到Dalvik VM里。
引入一种中间语言,例如字节码,虚拟机执行字节码,并且通过JIT编译器来提升JVM的性能的这种技术以及广泛应用在使用中间语言的编程语言上。例如微软的.Net,CLR(Common Language Runtime 公共语言运行时),也是一种VM,它执行一种被称作CIL(Common Intermediate Language)的字节码。CLR提供了AOT编译器和JIT编译器。因此,用C#或者VB.NET编写的源代码被编译后,编译器会生成CIL并且CIL会执行在有JIT编译器的CLR上。CLR和JVM相似,它也有垃圾回收机制,并且也是基于堆栈运行。
【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】
-
netty 在java中的字节码转换
2018-03-26 11:35:15netty通信时经常和底层数据交互,C语言和java的数据类型和范围不同,通信时需要转化或兼容,附件为字节码、进制常用的转换类。 -
Java字节码与Dalvik字节码
2016-07-13 12:40:46JVM只与字节码关联,而不与Java语言直接关联。事实上,JRuby,Groovy等语言也可以由相应的编译器编译为字节码,然后由JVM解释执行。甚至可以自己写一个class字节码文件,然后由JVM来执行。 2. class类文件结构 任何... -
Java字节码和Dalvik字节码
2017-06-17 00:03:37Java字节码和Dalvik字节码的区别,生成JAVA字节码和Dalvik字节码 -
java字节码例子 可以动态修改类 bcel
2019-03-28 02:15:33NULL 博文链接:https://andilyliao.iteye.com/blog/899925 -
Java源程序如何变成Java字节码?
2021-02-12 22:31:49谢邀,题主的问题主要涉及到编译和反编译相关的知识,简单帮你回答...其实,class文件仍然不是机器能够识别的语言,因为机器只能识别机器语言,还需要JVM再将这种class文件类型字节码转换成机器可以识别的机器语言。 -
InjKit:注射套件。 它是用于字节码注入和转换的Java字节码处理库
2021-05-23 05:23:28插件或注入器可以基于Java注释或类或方法的名称添加额外的字节码,例如try ... catch ...块,对记录器的调用等。 它可以作为Gradle Plugin或通过CLI轻松集成到构建工作流程中。 执照 InjKit是。 -
C2j-Compiler:将C语言转换为Java字节码或可以直接解释执行的编译器(将C语言编译成Java字节码的编译器,也...
2021-03-23 01:30:50将C语言转换为Java字节码或可以直接解释执行的编译器 作为一个学习项目 可以解释为执行大多数C或编译为Java字节码 玩具级,未添加许多功能,也没有优化 支持的 支持所有基本陈述 解释器:支持指针,数组,结构和... -
从一个class文件深入理解Java字节码结构
2020-11-15 10:01:31我们都知道,Java程序最终是转换成class文件执行在虚拟机上的,那么class文件是个怎样的结构,虚拟机又是如何处理去执行class文件里面的内容呢,这篇文章带你深入理解Java字节码中的结构。 1.Demo源码 首先,编写一... -
Java字节码指令
2021-03-15 04:19:001. 简介Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码)以及跟随其后的零至多个代表此操作所需参数(称为操作数)而构成。...2. 字节码和数据类型在Java虚拟机的指令集... -
Java字节码
2019-01-14 13:23:40Java最黑科技的玩法就是字节码编程,也就是动态修改或是动态生成 Java 字节码。使用字节码可以玩出很多高级的玩法,最高级的还是在 Java 程序运行时进行字节码修改和代码注入。听起来是不是一些很黑客,也很黑科技的... -
Java字节转字符串
2021-04-29 21:00:43**2、**由于字节转字符串时会有一些转义,导致字节转换成字符串后和之前的不一样,这是因为编码方式的问题。需将编码方式设置为StandardCharsets.ISO_8859_1。 **3、**还要注意,如果使用io流时,用这种方法得到的... -
jvm2cfg:原型Python脚本,可将JVM字节码转换为控制流程图
2021-02-13 07:26:32Python原型脚本将JVM字节码转换为控制流程图。 Utlize networkx框架来构建图形,并使用matplotlib显示可视化表示。 支持方法之间的函数调用边。 要运行,请在jvm2cfg.py的第267行上更改名为“ text_file”的变量,以... -
Java字节码文件
2019-07-02 20:27:34字节码文件信息 常量池 方法表集合 二、分析try-catch-finally的demo 计算机只认识0和1。这意味着任何语言编写的程序最终都需要经过编译器编译成机器码才能被计算机执行。所以,我们所编写的程序在不同的平台上... -
cglib,字节码生成库是生成和转换Java字节码的高级API。它被aop、测试、数据访问框架用来生成动态代理对象和...
2019-10-12 08:53:17字节码生成库是生成和转换java字节码的高级api。 -
什么是Java字节码?
2018-11-18 22:10:14什么是Java字节码? 它是程序的一种低级表示,可以运行于Java虚拟机上。将程序抽象成字节码可以保证Java程序在各种设备上的运行 Java号称是一门“一次编译到处运行”的语言,从我们写的java文件到通过编译器编译成... -
Java字节码增强探秘
2019-09-10 08:48:00本文转载自公众号美团技术团队大家好,美美今天给大家推荐一篇Java字节码增强技术的文章,在实际工作中有很多应用场景。美团点评技术团队平日积累了很多这类技术原理解析和实... -
java byte转换工具类
2017-12-12 16:18:32用于java,byte与各种对象的转换,Integer、short、hex、string