2016-01-14 7 views
1

Я пытаюсь написать JVM байт-код для класса эквивалентно следующему:Java ByteCode на массив строк [Bad Type в putstatic]

public class foo { 
    static String[] crr; 
    public static void printString(String str) { 
    System.out.println(str); 
    } 
    public static void main(String[] args) { 
    crr = new String[10]; 
    crr[0] = "Hello"; 
    foo.printString(crr[0]); 
    } 
} 

Байткод я писал:

.class public foo 
.super java/lang/Object 
.field public static crr [Ljava/lang/String; 
.method public <init>()V 
    aload_0 
    invokenonvirtual java/lang/Object/<init>()V 
    return 
.end method 
.method public static printString(Ljava/lang/String;)V 
    .limit locals 1 
    .limit stack 2 
    getstatic java/lang/System/out Ljava/io/PrintStream; 
    aload_0 
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V 
    return 
.end method 
.method public static main([Ljava/lang/String;)V 
    .limit stack 20 
    .limit locals 10 
    bipush 9 
    anewarray Ljava/lang/String; 
    putstatic foo.crr [Ljava/lang/String; 
    getstatic foo.crr [Ljava/lang/String; 
    ldc 0 
    ldc "Hello" 
    aastore 
    getstatic foo.crr [Ljava/lang/String; 
    ldc 0 
    aaload 
    invokestatic foo.printString(Ljava/lang/String;)V 
    return 
.end method 

I используйте Jasmine для запуска байт-кода и получите Плохая ошибка типа для getfield/putfield, но не может понять, почему.

Exception in thread "main" java.lang.VerifyError: (class: foo, method: main signature: ([Ljava/lang/String;)V) Bad type in putfield/putstatic 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2625) 
    at java.lang.Class.getMethod0(Class.java:2866) 
    at java.lang.Class.getMethod(Class.java:1676) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 

Кто-нибудь знает, где проблема и как ее решить?

ответ

1

У вас есть ошибка в инструкции anewarray. Вместо

anewarray Ljava/lang/String; 

вам нужно написать

anewarray java/lang/String 
+0

Спасибо !!! Вы можете более подробно объяснить, когда я должен использовать "Ljava/языки/String;" или "java/lang/String"? –

+0

@RuoChunZeung сочетание имен и дескрипторов сбивает с толку, в конце вам нужно проконсультироваться с документацией (http://jasmin.sourceforge.net/instructions.html): инструкция anewarray просто ожидает имя класса, а не дескриптор. – wero

 Смежные вопросы

  • Нет связанных вопросов^_^