JVM常量的含义与反编译助记符详解
1、定义一个常量
public class MyTest2 {
public static void main(String[] args) {
System.out.println(MyParent2.str);
}
} class MyParent2{ public static final String str = "hello world"; static {
System.out.println("MyParent2 static block");
} }
打印结果:
hello world
此时MyParent2类不会进行实例化,因为str是一个常量。常量在编译阶段,会存如调用这个常量的方法所在类的常量池中。本质上,调用类并没有直接引用到定义常量的类,因此并不会触发定义常量的类初始化。
注意: 这里值的是将常量str存放到MyTest2类的常量池中,之后MyTest2和MyParent2就没有任何关系了。甚至,我们可以将MyParent2的class文件删除。
2.使用javap反编译class文件(jdk版本1.7)
命令:javap -c MyTest2.class
3: ldc #3 // String hello world
说明System.out.println(MyChild1.str); 这行代码已经成为hello world
3、增加一个short类型的常量
public class MyTest2 {
public static void main(String[] args) {
System.out.println(MyParent2.s);
}
} class MyParent2{ public static final String str = "hello world"; public static final short s = 8; static {
System.out.println("MyParent2 static block");
} }
反编译
此时已经变为bipush
4、助记符:
1)、ldc表示将int,float或是String类型的常量值从常量池中推送至栈顶。 (public static final String str = "hello world";)
2)、bipush 表示将单字节(-128 ~ 127)的常量推送至栈顶(public static final short s = 8;)
3)、sipush表示将一个短整型常量值(-32678 ~ 32676)推送至栈顶 (public static final int i = 128;)
4)、iconst_1 表示将int类型的1推送至栈顶(iconst_m1, iconst_0, iconst_1 ~ icont_5 -1到5)(public static final short m = 1)
5、助记符相关的类
每个助记符都有相关的类
1)LDC
2) ICONST.java源码
在包com.sun.org.apache.bcel.internal.generic;下
6、编译期常量与运行期的常量的区别
创建MyParent3类,里面有一个常量,但这个常量是UUID
public class MyTest3 {
public static void main(String[] args) {
System.out.println(MyParent3.str);
}
} class MyParent3{
public static final String str = UUID.randomUUID().toString(); static {
System.out.println("MyParent3 static code");
}
}
打印输出:
MyParent3 static code
a8be85e9-ef3c-4fd9-88aa-56b2c377a25c
总结: 当一个常量的值并非编译期间可以确定的,那么其值就不会被放到调用类的常量池中,这时在程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类被初始化
JVM常量的含义与反编译助记符详解的更多相关文章
- JAVA_Android APK反编译就这么简单 详解(附图)
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- 【转】Android APK反编译就这么简单 详解(附图)
转载地址:http://blog.csdn.net/vipzjyno1/article/details/21039349 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂 ...
- Android APK反编译就这么简单 详解(附图)
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- (转)[置顶] Android APK反编译就这么简单 详解(附图) .
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- Android APK反编译:APKtool使用详解
导言:在我们安卓开发当中,我们不仅需要掌握基础的开发技能,也需要掌握软件的安全技能,这样才可以让我们的软件能够成为一款能够真正可以进行发布的软件,同时也可以让自己的核心技术不会被别人所盗取. 第一步. ...
- lombok @Builder注解使用的例子、反编译之后的代码详解
lombok的@Builder实际是建造者模式的一个变种,所以在创建复杂对象时常使用 这里对lombok的@Builder和@Data组合的使用示例 import lombok.Builder; im ...
- Android APK反编译就这么简单 详解
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- Android APK反编译就这么简单 详解(附图)--转
转自:http://blog.csdn.net/vipzjyno1/article/details/21039349/ 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮 ...
- [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符
说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...
随机推荐
- 【MySql】Explain笔记
Explain -- 使用 Explain + SQL 分析执行计划: id:表示此表的执行优先级 id相同,表的执行顺序依次从上往下: id不同,并且递增,id值越大执 ...
- jenkins-harbor迁移(问题记录)
读者们原谅,可能有点没头没尾,根据公司情况具体写的 需求:jenkins和harbor迁移另一台物理机 jenkins和harbor都迁移的情况,之前一直都是使用的是harbor的域名 我也在新的je ...
- Java Decompiler反编译Jar文件
1.重新编译已经打包的Jar包,使用 Java Decompiler 打开需要重新编译的jar包,找到自己需要自己修改的Class文件 ,修改之后电子保存文件 ,保存的时候编译工具自动将class文件 ...
- HTML&CSS基础-边框简写属性
HTML&CSS基础-边框简写属性 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html> ...
- mysql安装好需要启动和停止服务
启动mysql: mysql.server start 停止服务:mysql.server stop
- 学习Kubernetes,这些负载均衡知识点得知道!
负载均衡 负载均衡是高可用架构的一个关键组件,主要用来提高性能和可用性,通过负载均衡将流量分发到多个服务器,同时多服务器能够消除这部分的单点故障. 一个没有使用负载均衡的Web架构一般会长得像这样: ...
- MyEclipse激活代码
package TestCase; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...
- matlat保存矩阵数据
a=[1 2 3; 4 5 6]; fid = fopen('haha.txt', 'w+');fprintf(fid,'%8.4f %8.3f %d\n', a');fclose(fid); typ ...
- 一个关于gcd的等式的证明
证:$a > b$ 且 $gcd(a,b)=1$,有 $gcd(a^n-b^n, a^m-b^m) = a^{gcd(n, m)} - b^{gcd(n,m)}$. 证明: 假设 $n > ...
- CQOI2016 不同的最小割 (最小割树模板)(等价流树的Gusfield构造算法)
题目 最小割树模板 算法详解及证明见: 2016年国家队候选队员论文 <浅谈无向图最小割问题的一些算法及应用--绍兴一中 王文涛> 3.2节 CODE #include <bits/ ...