2012-05-17 28 views
0

我設法在這個測試用例隔離我的問題:茉莉如何強制長場長久不變?

.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 

換句話說,長常量的值作爲整數存儲在類文件中。 有沒有辦法強制Jasmin將常量存儲在池中? 我試過1L但它不起作用。 將foo1的值設置爲大於INT_MAX(如2147483648)的數值確實修正了錯誤,但我希望找到一個不需要我更改常量值的解決方案。

Jasmin是否提供任何方式來做到這一點,或者這是否需要我更改jasmin的源代碼?

回答

0

同樣的問題與公共靜態最後雙常數存在:

點域公共靜態階段_1 d = 5.0

也似乎與相同的Java運行時錯誤崩潰。

我工作圍繞它通過移除「最終」標誌和初始化移動構造;-)