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

换句话说,long 常量的值作为整数存储在类文件中。有什么方法可以强制 Jasmin 将常量长期存储在池中吗?我试过1L了,但它不起作用。将 的值设置为foo1大于INT_MAX(例如2147483648)的数字确实可以修复错误,但我希望有一个不需要我更改常量值的解决方案。

Jasmin 是否提供任何方法来执行此操作,或者这是否需要我更改 jasmin 的源代码?

4

2 回答 2

0

我已经发布了一个修改版的 Jasmin,它允许我这样做。它可以在https://github.com/luiscubal/jasmin上找到

要在此修改版本上使用长常量,请执行以下操作:

.field public static foo J = 1l
于 2012-05-18T10:02:42.530 回答
0

公共静态最终双常量存在同样的问题:

.field 公共静态 PHASE_1 D = 5.0

似乎也因相同的 Java 运行时错误而崩溃。

我通过删除'final'标志并将初始化移动到构造函数来解决它;-)

于 2016-12-20T13:39:10.133 回答