package net.bytebuddy.test.utility; import net.bytebuddy.ClassFileVersion; import net.bytebuddy.asm.AsmVisitorWrapper; import net.bytebuddy.description.field.FieldDescription; import net.bytebuddy.description.field.FieldList; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.method.MethodList; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.implementation.Implementation; import net.bytebuddy.implementation.MethodAccessorFactory; import net.bytebuddy.implementation.auxiliary.AuxiliaryType; import net.bytebuddy.implementation.bytecode.StackManipulation; import net.bytebuddy.pool.TypePool; import org.junit.Test; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import java.io.IOException; import java.util.HashMap; import java.util.Map; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; public class ClassFileExtraction { private static final int CA = 0xCA, FE = 0xFE, BA = 0xBA, BE = 0xBE; public static Map<String, byte[]> of(Class<?>... type) throws IOException { Map<String, byte[]> result = new HashMap<String, byte[]>(); for (Class<?> aType : type) { result.put(aType.getName(), extract(aType)); } return result; } public static byte[] extract(Class<?> type, AsmVisitorWrapper asmVisitorWrapper) throws IOException { ClassReader classReader = new ClassReader(type.getName()); ClassWriter classWriter = new ClassWriter(classReader, AsmVisitorWrapper.NO_FLAGS); classReader.accept(asmVisitorWrapper.wrap(new TypeDescription.ForLoadedType(type), classWriter, new IllegalContext(), TypePool.Empty.INSTANCE, new FieldList.Empty<FieldDescription.InDefinedShape>(), new MethodList.Empty<MethodDescription>(), AsmVisitorWrapper.NO_FLAGS, AsmVisitorWrapper.NO_FLAGS), AsmVisitorWrapper.NO_FLAGS); return classWriter.toByteArray(); } public static byte[] extract(Class<?> type) throws IOException { return extract(type, new AsmVisitorWrapper.Compound()); } @Test public void testClassFileExtraction() throws Exception { byte[] binaryFoo = extract(Foo.class); assertThat(binaryFoo.length > 4, is(true)); assertThat(binaryFoo[0], is(new Integer(CA).byteValue())); assertThat(binaryFoo[1], is(new Integer(FE).byteValue())); assertThat(binaryFoo[2], is(new Integer(BA).byteValue())); assertThat(binaryFoo[3], is(new Integer(BE).byteValue())); } private static class Foo { /* empty */ } private static class IllegalContext implements Implementation.Context { @Override public TypeDescription register(AuxiliaryType auxiliaryType) { throw new AssertionError("Did not expect method call"); } @Override public FieldDescription.InDefinedShape cache(StackManipulation fieldValue, TypeDescription fieldType) { throw new AssertionError("Did not expect method call"); } @Override public TypeDescription getInstrumentedType() { throw new AssertionError("Did not expect method call"); } @Override public ClassFileVersion getClassFileVersion() { throw new AssertionError("Did not expect method call"); } @Override public MethodDescription.InDefinedShape registerAccessorFor(Implementation.SpecialMethodInvocation specialMethodInvocation, AccessType accessType) { throw new AssertionError("Did not expect method call"); } @Override public MethodDescription.InDefinedShape registerGetterFor(FieldDescription fieldDescription, AccessType accessType) { throw new AssertionError("Did not expect method call"); } @Override public MethodDescription.InDefinedShape registerSetterFor(FieldDescription fieldDescription, AccessType accessType) { throw new AssertionError("Did not expect method call"); } } }