2013-08-04 10 views
16

Poszukuję istniejących implementacji następującego pomysłu: załóżmy, że ktoś chce napisać kody bajtowe "wbudowanego zestawu" wewnątrz normalnego programu Java (większość odpowiednich aplikacji wymagałaby instrukcji invokedynamic, która nie jest inaczej dostępne w Javie). Jednym ze sposobów, aby to zrobić, będzie w następujący sposób:"Instalacja wbudowana" dla kodów bajtowych Java

void foo(boolean b) { 
    Label l1 = Asm.label(); 
    Label l2 = Asm.label(); 

    int i = Asm.no_int(); 
    Asm._const(0); 
    Asm.store(i); 
    l1.bind(); 
    Asm.load(i); 
    Asm.push(10); 
    Asm.if_cmpge(l2); 
    Asm.getstatic("java/lang/System", "out", "Ljava/io/PrintStream"); 
    Asm.load(i); 
    Asm.invokevirtual("java/io/PrintStream", "println", "(I)V"); 
    Asm.inc(i); 
    Asm._goto(l1); 
    l2.bind(); 
    Asm._return(); 
} 

Instrukcje są kodowane jako API, wówczas musielibyśmy prowadzić normalny kompilator Javy, a następnie do postprocesowego kod bajtowy i zastąpić wywołań API z rzeczywistymi instrukcjami.

P.S. Jestem świadomy ASMifier z ASM Framework, to nie rozwiązuje problemu określonego powyżej.

+0

Nie mamy do tego interfejsu Native Java? – user2357112

+2

JNI jest dla interfejsów między "natywnymi implementacjami" (wykonanymi w C, C++), on pyta o "wbudowany bajt kodowy" – morgano

+0

... o! Wbudowany kod bajtowy. Myślałem, że to jest pytanie o umieszczenie rzeczywistego języka asemblera w programie Java. – user2357112

Odpowiedz

6

ClassLoader ma metodę, defineClass, która pozwala dynamicznie generować klasę, podając kod bajtowy. Połącz to z Javassist lub innymi sugestiami z tego pytania o numerze previous.

+0

Szukałem montażu _linicznego_. –

1

Jeśli szukasz "stanu poprzedniego" patentu, myślę, że kompilator kodu natywnego JNode zrobił coś takiego z niektórymi metodami w swojej wersji klasy Unsafe. Jednak prymitywy nie były bajtodami. Raczej były to rzeczy, których nie można wyrazić jako bajty.


Wstrzykiwanie bytecodes że droga nie wydaje się dobrym pomysłem do mnie:

  • Są lepsze sposoby, aby to zrobić; na przykład BCEL.

  • Może być trudno (dla programisty) zintegrować to, co wstrzyknięte kody kodu próbują zrobić z resztą metody. Zwłaszcza biorąc pod uwagę, że bajty kodu dla reszty metody będą zależeć od używanego kompilatora java.

  • W przypadku języka Java na tradycyjnej platformie JVM należy wykonać translację Asm "wywołań" do bajtodów ... zanim klasa zostanie załadowana. Byłby wówczas poddawany sprawdzaniu przez weryfikatora.

+0

Patenty są złe. Po prostu szukam niektórych implementacji tego samego pomysłu. –