茉莉如何强迫长场不断长?

时间:2012-05-17 20:52:15

标签: jvm long-integer javap jasmin

我设法在这个测试用例中隔离了我的问题:

.bytecode 50.0
.class public test
.super java/lang/Object

.field public static final foo1 J = 1

.method public <init>()V
    .limit stack 1
    .limit locals 1
    .var 0 is this Ltest; from init_start to init_end

init_start:
    aload_0
    invokespecial java/lang/Object/<init>()V 
init_end:
    return
.end method

.method public static main([Ljava/lang/String;)V
    .limit stack 1
    .limit locals 1
main_start:
    new test
    invokespecial test/<init>()V
main_end:
    return
.end method

当我尝试运行时,我明白了:

$ jasmin test.j
$ java test
Exception in thread "main" java.lang.ClassFormatError: Inconsistent constant value type in class file test
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: test. Program will exit.

一些调查(javap)揭示了这一点:

public static final long foo1;
  Constant value: int 1

换句话说,long常量的值作为整数存储在类文件中。 有没有办法迫使Jasmin将常量存储在池中? 我试过了1L,但它不起作用。 将foo1的值设置为大于INT_MAX的数字(例如2147483648)会修复错误,但我希望找到一个不需要我更改的解决方案常数值。

Jasmin是否提供了任何方法来执行此操作,还是这需要我更改jasmin的源代码?

2 个答案:

答案 0 :(得分:0)

我发布了Jasmin的修改版本,允许我这样做。它可以在https://github.com/luiscubal/jasmin

上找到

要在此修改版本上使用长常量,请执行以下操作:

.field public static foo J = 1l

答案 1 :(得分:0)

公共静态最终双常量存在同样的问题:

.field public static PHASE_1 D = 5.0

似乎也因同一个Java运行时错误而崩溃。

我通过删除'final'标志并将初始化移动到构造函数来解决它;-)