Example usage for org.eclipse.jdt.internal.compiler.classfmt ClassFileConstants IntegerTag

List of usage examples for org.eclipse.jdt.internal.compiler.classfmt ClassFileConstants IntegerTag

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.compiler.classfmt ClassFileConstants IntegerTag.

Prototype

int IntegerTag

To view the source code for org.eclipse.jdt.internal.compiler.classfmt ClassFileConstants IntegerTag.

Click Source Link

Usage

From source file:org.springframework.ide.eclipse.core.java.typehierarchy.BytecodeTypeHierarchyClassReader.java

License:Open Source License

public TypeHierarchyElement readTypeHierarchy(InputStream stream) {
    try {/*from  w w  w .j  a  v  a  2s  .  c  om*/
        DataInputStream dis = new DataInputStream(new BufferedInputStream(stream));
        int magic = dis.readInt(); // magic 0xCAFEBABE
        if (magic != 0xCAFEBABE) {
            throw new IllegalStateException("not bytecode, magic was 0x" + Integer.toString(magic, 16));
        }
        skip(dis, 4);

        int constantPoolCount = dis.readShort();
        Object[] constantPoolData = new Object[constantPoolCount];
        for (int i = 1; i < constantPoolCount; i++) {
            int tag = dis.readByte();
            switch (tag) {
            case ClassFileConstants.Utf8Tag:
                constantPoolData[i] = dis.readUTF();
                break;
            case ClassFileConstants.IntegerTag:
                skip(dis, 4);
                break;
            case ClassFileConstants.FloatTag:
                skip(dis, 4);
                break;
            case ClassFileConstants.LongTag:
                skip(dis, 8);
                i++;
                break;
            case ClassFileConstants.DoubleTag:
                skip(dis, 8);
                i++;
                break;
            case ClassFileConstants.ClassTag:
                constantPoolData[i] = dis.readShort();
                break;
            case ClassFileConstants.StringTag:
                skip(dis, 2);
                break;
            case ClassFileConstants.FieldRefTag:
                skip(dis, 4);
                break;
            case ClassFileConstants.MethodRefTag:
                skip(dis, 4);
                break;
            case ClassFileConstants.InterfaceMethodRefTag:
                skip(dis, 4);
                break;
            case ClassFileConstants.NameAndTypeTag:
                skip(dis, 4);
                break;
            case 15: // ClassFileConstants.MethodHandleTag
                skip(dis, 3);
                break;
            case 16: // ClassFileConstants.MethodTypeTag
                skip(dis, 2);
                break;
            case 18: // ClassFileConstants.InvokeDynamicTag
                skip(dis, 4);
                break;
            }
        }

        skip(dis, 2);

        // classname
        short classNameIndex = dis.readShort();
        short classNameUTF8index = (Short) constantPoolData[classNameIndex];
        char[] className = ((String) constantPoolData[classNameUTF8index]).toCharArray();

        // superclass name
        short superclassNameIndex = dis.readShort();
        char[] superclassName = null;
        if (superclassNameIndex != 0) {
            short superclassNameUTF8index = (Short) constantPoolData[superclassNameIndex];
            superclassName = ((String) constantPoolData[superclassNameUTF8index]).toCharArray();
        }

        // interfaces
        short interfacesCount = dis.readShort();
        char[][] interfaceNames = null;
        if (interfacesCount != 0) {
            interfaceNames = new char[interfacesCount][];
            for (int i = 0; i < interfacesCount; i++) {
                short interfaceNameIndex = dis.readShort();
                short interfaceNameUTF8index = (Short) constantPoolData[interfaceNameIndex];
                interfaceNames[i] = ((String) constantPoolData[interfaceNameUTF8index]).toCharArray();
            }
        }

        return new TypeHierarchyElement(className, superclassName, interfaceNames);
    } catch (Exception e) {
        SpringCore.log(e);
    }

    return null;
}