26

代码示例:

public class StringHolder{
    public static final String ONE = "ONE";
    public static final String TWO = "TWO";
    public static final String THREE = "THREE";

    public static void main (String[] args){
        String someVariable = ONE + TWO + THREE;
    }
}

如何从静态常量评估字符串值?例如,使用 Intellij Idea,我可以在调试中运行程序,放置断点,在表达式上按“ctrl+alt+f8”并查看表达式值。那么是否可以在没有编译代码和运行程序的情况下使用静态分析器进行评估?关键是从静态常量而不是函数参数计算的值,因此分析器只需“转到”常量值,将它们连接起来并在弹出窗口中显示值。

当我有一个块和“刚刚初始化”的变量时的另一种情况:

{
    final String a = "a";
    final String b = "b"
    final String c = "c"
    String result = a+b+c;
}

PS你明白我的意思吗?:)

4

3 回答 3

38

使用 intellij idea 14 很容易:

  1. 只需将光标放在字符串连接上
  2. alt+enter
  3. 选择“将字符串连接文本复制到剪贴板”
  4. 将结果粘贴到某处。
于 2015-01-01T06:55:02.147 回答
4

您可以"ONETWOTHREE"通过反编译字节码来查看编译时连接的字符串:

javap -c StringHolder

并查看第一个作业。

for 的连接first + second + third仍将在执行时完成,而不是在编译时完成,因此我希望看到使用StringBuilderor的代码StringBuffer,并且如果不运行代码,则不会出现该字符串连接的“结果”。

于 2013-03-11T09:41:47.647 回答
-1
public static final String ONE = "ONE";
public static final String TWO = "TWO";
public static final String THREE = "THREE";

编译时常量,将在编译期间内联。

所以可以在.class反编译生成的文件中看到结果。另一个result直到运行时才可见。

因为你会在反编译的代码中someVariable看到类似的东西。someVariable = "ONETWOTHREE";编译器这样做是为了优化,所以是可见的。

于 2013-03-11T09:44:14.390 回答