字节码

Java字节码简介(Introduction to Java Bytecode)

二次信任 提交于 2019-12-08 14:11:29
本文为译文,原链接地址 Introduction to Java Bytecode ,首先感谢原文作者。 跟随本篇文章深入研究JVM内部结构和java字节码,你将会知道如何分解你的文件进行深入检查。 对于一个经验丰富的开发人员阅读java字节码也是非常枯燥的事情。首先我们要弄清楚我们为什么需要知道如此底层的东西?上周有一个能应用简单的场景:很早以前我作了代码修改,编译至jar包中并部署到服务测试一个潜在的性能问题。不幸的是修改的代码从未保存在版本控制系统,无论什么原因,本地修改的代码已消失的无影无踪。在几个月后,我再次需要原格式的修改的代码,但我已找不到了! 幸好编译后的代码还保存在服务器上,长舒一口气,我获取服务器的JAR并使用反编译工具打开。。唯一的问题:反编译工具GUI不是完美的,JAR中的许多类,只有我想反编译的那个特定类,UI打开时引起了bug,反编译器直接崩溃了! 绝望时孤注一掷,还好我属性原字节码,我宁愿再花些时间手动反编译一些代码而不去完成代码,再去测试它们。至少我还记得去哪儿查看代码,读字节码帮助我精确的找出修改的地方,把它们转换成源代码格式。 一旦你学会了字节码的语法,它可以应用到所有支持java的平台上——因为它是代码的中间的表现,不是最终通过底层cpu执行的代码。而且由于JVM结构相当的简单,字节码也比机器码简单,因此也是简化的指令集合

Kotlin的特点及各版本新特性

自作多情 提交于 2019-12-08 14:10:39
文章地址: https://sguotao.top/Kotlin-2018-10-08-Kotlin介绍及各版本新特性.html Kotlin语言的特点 Kotlin语义是一座小岛,是一种在Java虚拟机上运行的静态类型编程语言,Kotlin的目的就是要兼具现代编程语言的所有优点,同时还要具有Java语言的跨平台性,并且要做到简洁。它也可以被编译成为JavaScript源代码。Kotlin与Java 100%兼容,能够运行在Android平台和浏览器上。 Kotlin的应用场景 1.Kotlin Script 在IntellJ Idea中创建后缀为.kts的脚本文件,可以直接运行。Gradle在3.0之后部分支持Kotlin作为其脚本语言。 2.Java虚拟机应用 常见的Web应用,JavaFx应用,Kotlin都完美支持。Kotlin非常适合开发服务器端应用程序,允许编写简洁和富有表现力的代码,同时保持与现有基于Java的技术堆栈的完全兼容性和平滑的学习曲线; 3.前端开发 Kotlin从1.1版本开始,Kotlin可以编译成JavaScript代码,运行在浏览器上。目前Kotlin已经支持ECMAScript 5.1,有计划最终支持ECMAScript 2015。 4.Android应用开发 这是Kotlin应用的主战场,Kotlin非常适合开发Android应用程序

如何开发一个白盒测试工具(基于Python语言)

☆樱花仙子☆ 提交于 2019-12-08 10:59:41
问题背景 网上有许多介绍如何使用一种白盒测试工具的教程,但是很少有教人自己开发一个白盒测试工具的教程。因此我做了一次这样的实验,根据Python语言的特性,开发一个Python代码的白盒测试工具,实现以下功能:记录程序执行路径、获取函数调用关系、计算代码覆盖率、语句覆盖率、分支覆盖率(判定覆盖率)、字节码覆盖率。其中字节码覆盖率是我自己造的一个词,本想用于实现计算条件覆盖率的,奈何没有成功。 实验环境 编程语言:Python 编程环境:Linux16.04 + Anaconda2 + Python2.7 完整代码可以到我的GitHub上查看: https://github.com/Jancy1072/pycoverage 原理 1、Python是基于虚拟机的语言,首先是通过编译器编译成字节码文件,然后在运行时通过解释器解释成机器文件。Python是一种先编译后解释的语言。 我们在硬盘上看到的.pyc文件就是字节码文件,它来源于:当python程序运行时,编译的结果保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到.pyc文件中。当python程序第二次运行时,程序首先会在硬盘中寻找.pyc文件,如果找到,则直接载入,否则就重复上面的过程。在载入之前还会先检查一下.py文件和.pyc文件保存的最后修改日期

ASM(二) 利用Core API 变更类成员

一笑奈何 提交于 2019-12-08 10:04:46
之前一篇简单介绍了一下 ASM 框架。这一篇继续对CoreApi进行扩展。这里还是继续对ClassWriter ,ClassReader和ClassVisitor的应用的扩展。前面一篇主要介绍的是ClassWriter和ClassReader单独应用的场景。这一篇把这两者作为producer(ClassReader)和consumer(ClassWriter)来结合起来介绍一下另外一些用途。、 回顾: ASM 通过树这种数据结构来表示复杂的字节码结构,并利用 Push 模型来对树进行遍历,在遍历过程中对字节码进行修改。所谓的 Push 模型类似于简单的 Visitor 设计模式,因为需要处理字节码结构是固定的,所以不需要专门抽象出一种 Vistable 接口,而只需要提供 Visitor 接口。所谓 Visitor 模式和 Iterator 模式有点类似,它们都被用来遍历一些复杂的数据结构。Visitor 相当于用户派出的代表,深入到算法内部,由算法安排访问行程。Visitor 代表可以更换,但对算法流程无法干涉,因此是被动的,这也是它和 Iterator 模式由用户主动调遣算法方式的最大的区别。 在 ASM 中,提供了一个 ClassReader 类,这个类可以直接由字节数组或由 class 文件间接的获得字节码数据,它能正确的分析字节码,构建出抽象的树在内存中表示字节码

ASM原理详解,以及使用附代码,AOP利器

雨燕双飞 提交于 2019-12-08 10:03:49
少年,git代码,带你快速理解: https://github.com/singgel/eight-sorting-algorithms/tree/master/src/test/java/com/hks/eightsortingalgorithms/asm 一、什么是ASM   ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。asm字节码增强技术主要是用来反射的时候提升性能的,如果单纯用jdk的反射调用,性能是非常低下的,而使用字节码增强技术后反射调用的时间已经基本可以与直接调用相当了   使用ASM框架需要导入asm的jar包,下载链接:asm-3.2.jar。 二、如何使用ASM   ASM框架中的核心类有以下几个:   ① ClassReader:该类用来解析编译过的class字节码文件。   ② ClassWriter:该类用来重新构建编译后的类,比如说修改类名、属性以及方法

ASM(一) 利用Core API 解析和生成字节码

*爱你&永不变心* 提交于 2019-12-08 10:03:21
ASM 是一个提供字节码解析和操作的框架。Cglib框架就是基于ASM框架实现的,被广泛应用的Hibernate,Spring就是基于Cglib 实现了AOP技术。 在说到AOP的Java实现,可能会优先想到java的Proxy api,通过invoke方法拦截处理相应的代码逻辑,但是proxy 是面向接口的,被代理的class的所有方法调用都会通过反射调用invoke 方法,相对性能开销大。另外的还有Java 5提供的Instrument,比较适用于监控检查方面,但在处理灵活的代码逻辑方面并不合适。 ASM 框架对用户屏蔽了整个类字节码的长度,偏移量,能够更加灵活和方便得实现对字节码的解析和操作。其主要提供了两部分主要的API,Core Api 及Tree Api。 ASM 提供了两组API:Core和Tree: Core是基于访问者模式来操作类 Tree是基于树节点来操作类的 本文先从Core Api的解析和生成字节码开始介绍。 ASM 内部采用 访问者模式 将 .class 类文件的内容从头到尾扫描一遍,每次扫描到类文件相应的内容时,都会调用 ClassVisitor 内部相应的方法。 比如: 扫描到类文件时,会回调 ClassVisitor 的 visit() 方法; 扫描到类注解时,会回调 ClassVisitor 的 visitAnnotation() 方法;

asm-giude阅读笔记003(ASM核心API接口和对应组件---读取字节码)

亡梦爱人 提交于 2019-12-08 09:58:46
2.2 接口和组件 2.2.1 介绍 ASM API 生成和转换Java字节码的操作都是基于ClassVisitor这个接口的。这个接口中的方法的方法名都是与字节码文件中节的名字对应的。 ClassVisitor 接口的代码清单: public interface ClassVisitor { void visit(int version, int access, String name, String signature, String superName, String[] interfaces); void visitSource(String source, String debug); void visitOuterClass(String owner, String name, String desc); AnnotationVisitor visitAnnotation(String desc, boolean visible); void visitAttribute(Attribute attr); void visitInnerClass(String name, String outerName, String innerName, int access); FieldVisitor visitField(int access, String name,

Java中ASM框架详解

戏子无情 提交于 2019-12-08 09:58:19
什么是asm呢?asm是assembly的缩写,是汇编的称号,对于java而言,asm就是字节码级别的编程。 而这里说到的asm是指objectweb asm,一种.class的代码生成器的开源项目. ASM是一套java字节码生成架构,它可以动态生成二进制格式的stub类或其它代理类, 或者在类被java虚拟机装入内存之前,动态修改类。 现在挺多流行的框架都使用到了asm.所以从aop追溯来到了这。 1.什么是ObjectWeb ASM ObjectWeb ASM是轻量级的Java字节码处理框架。它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。 ASM 提供了与 BCEL和SERP相似的功能,只有22K的大小,比起350K的BCEL和150K的SERP来说,是相当小巧的,并且它有更高的执行效率, 是BCEL 的7倍,SERP的11倍以上。 在我看来,ObjectWeb ASM具有如下几个非常诱人的特点 * 小巧、高效 * 源代码实现非常简洁而又优雅,简直就是Gof的《设计模式》非常棒的注解 * 字节码级的控制,能够更高效地实现字节码的控制 ObjectWeb ASM有2组接口: * 基于事件驱动的接口,类似于xml的SAX接口,visitor模式,在访问到类定义某个部分的时候进行回调,实现上比tree接口高效,占用内存更小 *

JVM

自闭症网瘾萝莉.ら 提交于 2019-12-07 21:43:16
一、JVM一些基本概念 1、JVM和普通虚拟机 JVM:Java Virtual Machine,程序自己独立的运行环境;堆栈、寄存器、字节码指令;可以运行多种语言:Java、Scala、Grovvy; 普通虚拟机:能完整提供虚拟主机的PC,必须安装操作系统,以CPU指令运行。例如VMWare、Visual Box 2、JVM/JDK/JRE关系 JVM :(Java Virtual Machine),只认识 class文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心。 JRE :(Java Runtime Environment),Java 运行时环境。它主要包含 jvm 的标准实现和 Java 的一些基本类库。JRE = JVM + Java 类库。 JDK :(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。 显然,这三者的关系是:一层层的嵌套关系 JDK>JRE>JVM 3、JVM产品有哪些 HotSpot、Jrockit、J9 4、为什么会出现JVM Java程序编译后的文件是*.class文件,*

JVM

为君一笑 提交于 2019-12-07 21:38:30
一、JVM一些基本概念 1、JVM和普通虚拟机 JVM:Java Virtual Machine,程序自己独立的运行环境;堆栈、寄存器、字节码指令;可以运行多种语言:Java、Scala、Grovvy; 普通虚拟机:能完整提供虚拟主机的PC,必须安装操作系统,以CPU指令运行。例如VMWare、Visual Box 2、JVM/JDK/JRE关系 JVM :(Java Virtual Machine),只认识 class文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心。 JRE :(Java Runtime Environment),Java 运行时环境。它主要包含 jvm 的标准实现和 Java 的一些基本类库。JRE = JVM + Java 类库。 JDK :(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。 显然,这三者的关系是:一层层的嵌套关系 JDK>JRE>JVM 3、JVM产品有哪些 HotSpot、Jrockit、J9 4、为什么会出现JVM Java程序编译后的文件是*.class文件,*