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 に定数をプールに long として保存させる方法はありますか? 試してみまし1Lたが、うまくいきません。の値を( などの)foo1より大きい数値に設定するとエラーは修正されますが、定数値を変更する必要のない解決策を望んでいました。INT_MAX2147483648

Jasmin はこれを行う方法を提供していますか、それとも jasmin のソース コードを変更する必要がありますか?

4

2 に答える 2

0

これを可能にする Jasmin の修正版をリリースしました。https://github.com/luiscubal/jasminで入手できます

この変更されたバージョンで long 定数を使用するには、次のようにします。

.field public static foo J = 1l
于 2012-05-18T10:02:42.530 に答える