[英]java bytecode class definition
目前我正在做一个处理字节码分析的项目。 我遇到了代码,
char[] buff = new char[1];
//some code tainting the buff
return (new String(buff));
在字节码中,我发现new String(buff)
的相关映射为
Ljava/lang/StringValue.cache
你们中的任何人都可以解释这个cache
字段从哪里来的场景吗?
它来自 jdk i.6, StringValue 。 根据描述,“这个类完全由静态方法组成,这些方法对字符串使用的字符数组进行操作以存储值。”
任何人都可以对此有所了解吗? 它的目的究竟是什么? 我认为这主要是因为他们使用的字符缓冲区作为参数传递给字符串。 这个类不是修改缓冲区的内容,而是我认为它只是说明缓冲区内容仅用于初始化字符串的网关。
那真的不可能。 这是您最近发布的Javac编译后发布的序列的样子。
iconst_1
newarray char
astore_1
new java/lang/String
dup
aload_1
invokespecial java/lang/String <init> ([C)V
areturn
而且,至少从jre1.7.0_17开始, java/lang/StringValue
甚至不存在。 此外,句点的存在表明它可能是Jasmin合并的类/方法标记中的一种,在这种情况下,它实际上是指Ljava
包中的类,无论它应该是什么。
主要有两种可能性-损坏的编译器或损坏的反汇编程序。 如果您在此处发布类文件,我们至少可以找出是哪种情况。
显然,如果已经存在具有相同内容的缓存字符串,则该方法将返回该字符串。 实际上就像String.intern()一样。
字节码是Java程序的中间表示,就像汇编程序是C或C ++程序的中间表示一样。 最有名的C和C ++程序员知道他们要为其编译的处理器的汇编程序指令集。 在调试以及进行性能和内存使用调整时,此知识至关重要。 了解编译器为您编写的源代码生成的汇编器指令,可以帮助您了解如何以不同的方式编码以实现内存或性能目标。 此外,在跟踪问题时,使用调试器反汇编源代码并逐步执行正在执行的汇编器代码通常很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.