2015-06-16 7 views
8

Я использую ByteBuddy для создания класса во время выполнения с динамически генерируемым байтовым кодом. Сгенерированный класс делает то, что он предназначен, но я хочу вручную проверить сгенерированный байт-код, чтобы убедиться, что он правильный.Отображается сгенерировано bytebuddy bytecode

Например

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

где команда MyImplementation цепи множественный StackManipulation вместе, чтобы создать динамически сгенерированный код.

Могу ли я записать сгенерированный класс в файл (так что я могу вручную обследовать с помощью IDE) или иначе распечатать байт-код для сгенерированного класса?

+0

Как указано, вы можете сохранить файл как файл класса и проверить его с помощью * javap *. –

ответ

11

Вы можете сохранить класс как файл .class:

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

Этот код создает c:/temp/Foo.class.

2

Ниже приведен пример сохранения байтов сгенерированного класса в массиве байтов. И как класс может быть сохранен в файловой системе и может быть создан из этого массива.

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

Спасибо SubOptimal. Я принял ответ saka1029, потому что он был короче и достиг того же самого. – bramp

+0

@bramp Это нормально. Потому что ответы решают разные вещи. Ответ от saka1029 генерирует класс и сохраняет его в файле. Мой ответ генерирует класс, сохраняет его в файл, и вы можете создать экземпляр созданного класса. Если вам не нужно создавать экземпляр сгенерированного класса или не нужен доступ к сгенерированным байтам, ответ saka1029 - это путь. – SubOptimal

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