2015-06-16 13 views
8

Sto usando ByteBuddy per creare una classe in fase di esecuzione con codice byte generato dinamicamente. La classe generata fa ciò che è destinato a fare, ma voglio ispezionare manualmente il codice byte generato, per assicurarmi che sia corretto.Visualizzazione generata bytecode bytebuddy

Ad esempio

Class<?> dynamicType = new ByteBuddy() 
     .subclass(MyAbstractClass.class) 
     .method(named("mymethod")) 
     .intercept(new MyImplementation(args)) 
     .make() 
     .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) 
     .getLoaded(); 

dove comanda catene MyImplementation multipla StackManipulation insieme per creare il codice generato dinamicamente.

Posso scrivere la classe generata su un file, (così posso ispezionare manualmente con un IDE), o altrimenti stampare il bytecode per la classe generata?

+0

Come indicato, è possibile memorizzare il file come file di classe e ispezionarlo utilizzando * javap *. –

risposta

11

È possibile salvare il file di classe come .class:

new ByteBuddy() 
    .subclass(Object.class) 
    .name("Foo") 
    .make() 
    .saveIn(new File("c:/temp")); 

Questo codice crea c:/temp/Foo.class.

2

Trova di seguito un esempio per memorizzare i byte della classe generata in un array di byte. E come la classe può essere salvata nel file system e può essere istanziata da questo array.

import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.nio.file.StandardOpenOption; 
import net.bytebuddy.ByteBuddy; 
import net.bytebuddy.instrumentation.FixedValue; 
import static net.bytebuddy.instrumentation.method.matcher.MethodMatchers.named; 

public class GenerateClass extends ClassLoader { 

    void doStuff() throws Exception { 
     byte[] classBytes = new ByteBuddy() 
       .subclass(Object.class) 
       .name("MyClass") 
       .method(named("toString")) 
       .intercept(FixedValue.value("Hello World!")) 
       .make() 
       .getBytes(); 

     // store the MyClass.class file on the file system 
     Files.write(Paths.get("MyClass.class"), classBytes, StandardOpenOption.CREATE); 

     // create an instance of the class from the byte array 
     Class<?> defineClass = defineClass("MyClass", classBytes, 0, classBytes.length); 
     System.out.println(defineClass.newInstance()); 
    } 

    public static void main(String[] args) throws Exception { 
     new GenerateClass().doStuff(); 
    } 
} 
+0

Grazie SubOptimal. Ho accettato la risposta di saka1029, perché era più breve e ha ottenuto la stessa cosa. – bramp

+0

@bramp Va bene. Perché le risposte stanno risolvendo cose diverse. La risposta di saka1029 genera la classe e la salva in un file. La mia risposta genera la classe, la salva in un file e puoi creare un'istanza della classe generata. Se non è necessario creare un'istanza della classe generata o non è necessario accedere ai byte generati, la risposta di saka1029 è la strada da seguire. – SubOptimal