Жасмин, как заставить длинное поле быть длинной постоянной?
Мне удалось выделить мою проблему в этом тестовом примере:
.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?
2 ответа
Я выпустил модифицированную версию Jasmin, которая позволяет мне это делать. Он доступен по https://github.com/luiscubal/jasmin.
Чтобы использовать длинные константы в этой модифицированной версии, сделайте это:
.field public static foo J = 1l
Такая же проблема существует с открытыми статическими двойными константами:
.field public static PHASE_1 D = 5.0
также кажется, что происходит сбой с той же ошибкой времени выполнения Java.
Я обошел его, убрав флаг final и перенеся инициализацию в конструктор;-)