2013-08-04 11 views
16

Sto cercando le implementazioni esistenti della seguente idea: supponiamo che qualcuno voglia scrivere i codici byte "assembly inline" all'interno di un normale programma Java (la maggior parte delle applicazioni rilevanti implicherebbe istruzioni dinamiche invocate che non lo sono altrimenti disponibile in Java). Un modo per fare questo potrebbe essere il seguente:"Assemblaggio in linea" per codici byte 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(); 
} 

Istruzioni sono codificati come chiamate API, allora avremmo bisogno di eseguire un normale compilatore Java, e quindi al post-processo il codice di byte e sostituire le chiamate API con istruzioni reali.

P.S. Sono a conoscenza di ASMifier di ASM Framework, non risolve il problema sopra indicato.

+0

Non abbiamo l'interfaccia nativa Java per questo? – user2357112

+2

JNI è per interfacce tra "implementazioni native" (realizzate in C, C++), sta chiedendo "bytecode in linea" – morgano

+0

... oh! Bytecode in linea. Ho pensato che questa fosse una domanda su come integrare il linguaggio assembly reale in un programma Java. – user2357112

risposta

6

ClassLoader ha un metodo, defineClass, che consente di generare dinamicamente una classe fornendo il bytecode. Combina questo con Javassist o altri suggerimenti da questa domanda previous.

+0

Stavo cercando _inline_ assembly. –

1

Se si sta cercando "arte nota" per un brevetto, penso che il compilatore di codice nativo JNode abbia fatto questo genere di cose con alcuni metodi nella sua versione della classe Unsafe. Tuttavia, i primitivi non erano bytecode. Piuttosto erano cose che non potevano essere espresse come bytecode.


Iniezione bytecode in questo modo non sembra una buona idea per me:

  • ci sono modi migliori per farlo; per esempio. BCEL.

  • Potrebbe essere difficile (per il programmatore) integrare ciò che i bytecode iniettati stanno cercando di fare con il resto del metodo. Soprattutto se si considera che i bytecode per il resto del metodo dipenderanno dal compilatore java che si sta utilizzando.

  • Per Java su una piattaforma JVM convenzionale, avresti bisogno di fare la traduzione di Asm "chiamate" a bytecode ... prima della classe è stato caricato. Sarebbe quindi soggetto a verifica da parte del verificatore.

+0

I brevetti sono malvagi. Sto solo cercando alcune implementazioni della stessa idea. –