我设法在这个测试用例中隔离了我的问题:
.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的源代码?
答案 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'标志并将初始化移动到构造函数来解决它;-)