美文网首页程序员
java字节码判断对象应用是否被修改

java字节码判断对象应用是否被修改

作者: 呜啼 | 来源:发表于2017-06-21 17:22 被阅读0次

原创

1 背景

在学习并发的时候看到了ConcurrentLinkedQueue队列的源码,刚开始的时候是看网上的帖子,然后就到IDE里边看源码,发现offer()方法在1.7版的时候有过修改。

楼主的问题不是整个方法,而是其中的一截代码“(t != (t = tail))”,有点发晕,t是个引用,而修改引用的时候不是都修改吗?怎么还会判断是否相等呢 ?

2 为了解决这个问题,写个测试方法。如下:

publicclassReferTest {

publicstaticvoidmain(String[] args) {

ReferTest a =newReferTest();

booleanb= (a != (a =newReferTest()));

}

}

答案:b= true。

说明 a != a,这个就更晕了。在度娘和谷歌上都查不到什么有用的资料,关键是不好描述,引用不等于引用?

再往下楼主就猜测了,引用的东西一般都和栈有关,就想看看方法的字节码指令。使用javap命令解释了方法的字节码指令。


有用的方法看main方法的指令,楼主没有接触过字节码指令,所以找个指令集学学了一下。在这里解释下指令的意义,在这里记录一下。

注意引用1是在命令8的时候加载的a的值,而引用2是新的引用,为什么出现这种情况,原因是if_acmpeq指令是比较两个栈顶的值是否一样。

所以在"!="号的两端的值需要加载到栈顶,而右边是一个表达式,所以先加载左边的值到栈顶然后再去执行右边的表达式,表达式的结果放入栈顶,这个时候a引用1先加载,而表达式的结果会改变a变量的值,但是不会改变栈顶的值。

所以就出现不一致的情况了。

同理,通过这个方式可以判断对应的引用是否改变了。

ps:跟同事讲解的时候,又分析了 i=i++ 、 i=++i、i= i+1的字节码,发现 i++ 使用的是iinc的命令,而i=i+1使用的是iadd指令。

相关文章

  • java字节码判断对象应用是否被修改

    原创 1 背景 在学习并发的时候看到了ConcurrentLinkedQueue队列的源码,刚开始的时候是看网上的...

  • 程序员练级攻略(2018):Java底层知识

    Java 字节码相关 首先,Java 最黑科技的玩法就是字节码编程,也就是动态修改或是动态生成 Java 字节码。...

  • 字节码技术

    字节码技术应用场景 AOP技术、Lombok去除重复代码插件、动态修改class文件等 字节技术优势 Java字节...

  • 史上最全的ASM原理解析与应用

    ASM简介 ASM是一个操作Java字节码类库,其操作的对象是字节码数据,处理字节码方式是“拆分-修改-合并”将....

  • Java并发机制的底层原理

    Java程序执行:Java代码→Java字节码→字节码被类加载器加载到JVM里,JVM执行字节码→转化为汇编指令在...

  • HotSpot虚拟机对象探秘

    1、对象的创建 1)判断类是否已被加载、解析和初始化 当Java虚拟机遇到一条字节码new指令时,首先将去检查这个...

  • ASM框架学习(一)-基本概念

    简介 ASM是java字节码操作框架,利用该框架可以达到动态修改java运行对象代码的目的,也可以实现动态代理等功...

  • 字节码引用检测原理与实战

    一、字节码与引用检测 1.1 Java字节码 本章中的字节码重点研究Java 字节码,Java字节码(Java b...

  • 反射

    1.原理 java反射是java中获取内存中字节码对象,然后获取对象的属性,方法对对像进行修改的一种技术。框架的核...

  • 22. java虚拟机总结-从栈帧看字节码 (五)

    怎么查看字节码文件?字节码文件长什么样子?对象初始化之后,具体的字节码又是怎么执行的? 查看字节码的工具 java...

网友评论

    本文标题:java字节码判断对象应用是否被修改

    本文链接:https://www.haomeiwen.com/subject/nastcxtx.html