Skip to content

de-compile enum StackOverflowError #67

Open
@zcoNick

Description

@zcoNick

Using ByteBuddy generate enum Gender, get byte array, de-compile to source. Throw StackOverflowError.

java.lang.StackOverflowError
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadClassFile(TypeMaker.java:1577)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadFieldsAndMethods(TypeMaker.java:1473)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadFieldsAndMethods(TypeMaker.java:1457)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1261)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1298)
	at org.jd.core.v1.service.converter.classfiletojavasyntax.util.TypeMaker.loadMethodTypes(TypeMaker.java:1269)
	...repeat...

My code is:

String enumClassName = "com.zco.lab.jdcore.enums.Gender";
DynamicType.Unloaded<? extends Enum<?>> unloaded = new ByteBuddy(ClassFileVersion.JAVA_V8)
        .makeEnumeration("MALE", "FEMALE")
        .name(enumClassName)
        .make();
// save class
unloaded.saveIn(new File("target/classes"));
byte[] bytes = unloaded.getBytes();
// de-compile
deCompile(enumClassName, bytes);

method deCompile:

private void deCompile(String className, byte[] bytes) throws Exception {
    Loader loader = new Loader() {
        @Override
        public boolean canLoad(String s) {
            return true;
        }

        @Override
        public byte[] load(String s) throws LoaderException {
            return bytes;
        }
    };
    Printer printer = new Printer() {
        protected static final String TAB = "  ";
        protected static final String NEWLINE = "\n";

        protected int indentationCount = 0;
        protected final StringBuilder sb = new StringBuilder();

        @Override
        public String toString() {
            return sb.toString();
        }

        @Override
        public void start(int maxLineNumber, int majorVersion, int minorVersion) {
        }

        @Override
        public void end() {
        }

        @Override
        public void printText(String text) {
            sb.append(text);
        }

        @Override
        public void printNumericConstant(String constant) {
            sb.append(constant);
        }

        @Override
        public void printStringConstant(String constant, String ownerInternalName) {
            sb.append(constant);
        }

        @Override
        public void printKeyword(String keyword) {
            sb.append(keyword);
        }

        @Override
        public void printDeclaration(int type, String internalTypeName, String name, String descriptor) {
            sb.append(name);
        }

        @Override
        public void printReference(int type, String internalTypeName, String name, String descriptor,
                                   String ownerInternalName) {
            sb.append(name);
        }

        @Override
        public void indent() {
            this.indentationCount++;
        }

        @Override
        public void unindent() {
            this.indentationCount--;
        }

        @Override
        public void startLine(int lineNumber) {
            for (int i = 0; i < indentationCount; i++) sb.append(TAB);
        }

        @Override
        public void endLine() {
            sb.append(NEWLINE);
        }

        @Override
        public void extraLine(int count) {
            while (count-- > 0) sb.append(NEWLINE);
        }

        @Override
        public void startMarker(int type) {
        }

        @Override
        public void endMarker(int type) {
        }
    };

    ClassFileToJavaSourceDecompiler decompiler = new ClassFileToJavaSourceDecompiler();

    String path = className.replace(".", "/");

    decompiler.decompile(loader, printer, path);

    String source = printer.toString();
    System.out.println(source);
    System.out.println();
}

Maven dependencies

<dependency>
    <groupId>net.bytebuddy</groupId>
    <artifactId>byte-buddy</artifactId>
    <version>1.12.10</version>
</dependency>
<dependency>
    <groupId>org.jd</groupId>
    <artifactId>jd-core</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.3.2</version>
</dependency>

Open Gender.class in Idea is OK.
Open Gender.class with JD-GUI 1.6.6 (jd-core 1.1.3) is OK.
image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions