我設法在這個測試用例隔離我的問題:茉莉如何強制長場長久不變?
.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的源代碼?