广东网站建设包括什么,网站建设 橙,软件ui设计怎么做网站,微信优惠券网站怎么做的目录 1.概述 2.字节码文件构成
2.1.魔数
2.2.版本号
2.3.常量池
2.4.访问标志
2.5.索引
2.6.字段表
2.7.方法表
3.字节码指令
3.1.概述
3.2.指令分类
3.2.1.加载存储指令
3.2.2.运算指令
3.2.3.其他指令
3.3.完整指令工作流程
4.字节码保护 1.概述
以往的编程…目录 1.概述 2.字节码文件构成
2.1.魔数
2.2.版本号
2.3.常量池
2.4.访问标志
2.5.索引
2.6.字段表
2.7.方法表
3.字节码指令
3.1.概述
3.2.指令分类
3.2.1.加载存储指令
3.2.2.运算指令
3.2.3.其他指令
3.3.完整指令工作流程
4.字节码保护 1.概述
以往的编程语言是直接编译为计算机可识别并直接执行的机器码但不同平台机器的指令集不同编译出来的机器码不同一个平台编译出来的机器码在另一个平台上可能无法正常运行。JAVA为了实现“write once run anywhere”的效果先将JAVA代码编译为平台无关的.class文件字节码文件不论什么平台编译出来的字节码都是一样的然后用适配不同平台的JVM来加载字节码文件将字节码文件翻译给对应平台来执行。
字节码文件是个二进制文件由JVM定义字节码文件的规范任何满足这种规范的class文件都会被JVM加载运行。字节码规范规定字节码应该具有以下基本结构 2.字节码文件构成 2.1.魔数
字节码的前4个字节是魔数所有字节码文件的魔数是固定的4个byte合起来是cafebabe用来标识该文件是JAVA的class文件。 2.2.版本号
字节码中记录编译使用的JDK版本字节码的第5、6位表示次版本号第7、8位表示主版本号 查表可以得示例中的版本号为JDK12。 2.3.常量池
常量池存放两大类常量
字面量如文本字符串、fnal的常量值等符号引用类和接口的全限定名、字段的名称和描述符、方法的名称和描述符
字节码中存放有常量池使用java -verbose命令可以反编译得到常量池信息。 2.4.访问标志
常量池结束后的两个字节描述了该Class是类还是接口以及是否被public、abstart、final等修饰符修饰。 2.5.索引
字节码文件中的索引分为三类
类索引父类索引接口索引集合
类索引
访问标志后的两个字节描述的是当前类的全限定名这两个字节保存的值为常量池中的索引值根据索引值就能在常量池中找到这个类的全限定名
父类索引
当前类名后的两个字节描述父类的全限定名同上保存的也是常量池中的索引值。
接口索引集合
父类名称后为两字节的接口计数器描述了该类或父类实现的接口数量。紧接着的n个字节是所有接口名称的字符串常量的索引值。 2.6.字段表
用来记录成员变量分为两部分
计数器记录成员变量的个数。数据区记录变量的具体内容。2.7.方法表
记录方法分为两部分
计数器记录方法的个数 数据区记录方法的具体内容属性列表中记录了方法的具体内容
Code源代码对应的]VM指令操作码LineNumberTable行号表将Code区的操作码和源代码中的行号对应3.字节码指令
3.1.概述
字节码指令在栈里面的每个栈帧中操作局部变量表进行对操作数栈的压栈出栈从而完成方法中编写的一系列内容变量表是“菜篮”操作数栈是“砧板”。
3.2.指令分类
3.2.1.加载存储指令
用于变量对于操作数栈的压栈、出栈。
用于将数据在栈帧中的局部变量表和操作数栈之间来回传输将一个局部变量加载到操作栈: iload、lload、fload、dload、aload等将一个数值从操作数栈存储到局部变量表: istore、Istore、fstore、dstore、astore等将一个常量加载到操作数栈: bipush、sipush、ldc、ldc_w、ldc2 w、aconst null、iconst m1等
3.2.2.运算指令
用于进行运算的指令。 iadd、isub、imul、idiv等类型转换指令i2b、i2l、i2s等对象/数组创建与访问指令new、newarray、getfield等操作数栈管理指令pop、dup等
3.2.3.其他指令 lfeq、goto等方法调用和返回指令 invokevirtual、ireturn等异常处理指令athrow同步控制指令 monitorenter、monitorexit
3.3.完整指令工作流程
以下面代码为例展示一个完整的指令工作流程
public class Sum {private int base 10;public long add(int toAdd){this .base toAdd;return this.base;}
}
反编译查看源码 整体步骤如下
aload 0 将索引为0的局部变量压栈dup 复制栈顶值并压栈getfeld 取出栈顶对象引用获取其成员变量并压栈iload_1 将索引为1 int型局部变量压栈iacd 取出栈顶两个int型值相加结来压栈puteld 将栈顶两个元素取出 (值和对象引用) 将值赋给该对象宇段i2l 将栈顶int型值取出转为long型压栈lreturn 将栈顶long型元素取出返回
4.字节码保护
防止字节码文件被反编译为.java文件一般有两种手段
字节码保护字节码混淆
字节码保护
对字节码进行加密使其不再遵循JVM的规范JVM加载之前先解密。
字节码混淆
被混淆代码依然遵循JVM制定的规范变量命名和程序流程上进行等效替换使得程序的可读性变差使得代码难以被理解和重用达到保护代码的效果。
常用的字节码混淆器ProGuard
下载地址https://www.guardsquare.com/en/products/proguard