【问题标题】:java bytecode class definitionjava字节码类定义
【发布时间】:2013-04-15 05:14:29
【问题描述】:

目前我正在从事一个处理字节码分析的项目。我遇到了代码,

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。根据描述,“这个类完全由静态方法组成,这些方法对字符串用于存储值的字符数组进行操作。”

任何人都可以对此有所了解吗?它的实际目的是什么?我认为这主要是因为他们使用的字符缓冲区作为参数传递给字符串。这个类并没有修改缓冲区的内容,而是我认为它只是一个网关来说明缓冲区的内容仅用于初始化一个字符串。

【问题讨论】:

  • 用什么编译器?我在 JDK 7 中看不到这一点。
  • 我的编译器是 jdk 1.6
  • 你使用什么样的编译器?是gcj吗?
  • 我用的是mac,所以可能不是gcj。

标签: java compiler-construction jvm bytecode


【解决方案1】:

这应该是不可能的。这是您发布的序列在最近的 Javac 编译后的样子。

iconst_1
newarray char
astore_1
new java/lang/String
dup
aload_1
invokespecial java/lang/String <init> ([C)V
areturn

此外,java/lang/StringValue 甚至不存在,至少在 jre1.7.0_17 中是这样。此外,句点的存在表明它可能是 Jasmin 合并的类/方法标记之一,在这种情况下,它实际上指的是 Ljava 包中的一个类,无论它应该是什么。

有两种主要可能性 - 编译器损坏或反汇编器损坏。如果您在此处发布类文件,我们至少可以弄清楚是哪种情况。

【讨论】:

    【解决方案2】:

    如果已经存在具有相同内容的字符串,则显然是一种返回缓存字符串的方法。实际上就像 String.intern() 一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多