мне удалось изолировать мою проблему в этом тесте: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
Другими словами, значение длинной константы хранится в файле класса как целое. Есть ли способ заставить Джасмина хранить константу в бассейне как долго? Я пробовал 1L
, но он не работает. Установка значения foo1
как число, превышающее INT_MAX
(например, 2147483648
), исправляет ошибку, но я надеялся на решение, которое не потребует от меня изменить постоянные значения.
Предоставляет ли Jasmin какой-либо способ сделать это, или это потребует от меня изменить исходный код jasmin?