/** * Create a classfile bytecode disassembler, able to produce a String representation of a given classfile. * * @return a classfile bytecode disassembler * @see ClassFileBytesDisassembler * @since 2.1 */ public static ClassFileBytesDisassembler createDefaultClassFileBytesDisassembler(){ return new Disassembler(); }
private final void decodeModifiersForModule(StringBuffer buffer, int accessFlags) { appendModifier(buffer, accessFlags, IModifierConstants.ACC_OPEN, "open", true); //$NON-NLS-1$ buffer.append(Messages.disassembler_space); } public static String escapeString(String s) {
private void decodeModifiersForField(StringBuffer buffer, int accessFlags) { decodeModifiers(buffer, accessFlags, new int[] { IModifierConstants.ACC_PUBLIC, IModifierConstants.ACC_PROTECTED, IModifierConstants.ACC_PRIVATE, IModifierConstants.ACC_STATIC, IModifierConstants.ACC_FINAL, IModifierConstants.ACC_TRANSIENT, IModifierConstants.ACC_VOLATILE, IModifierConstants.ACC_ENUM }); }
IClassFileAttribute classFileAttribute = Util.getAttribute(classFileReader, IAttributeNamesConstants.SIGNATURE); ISignatureAttribute signatureAttribute = (ISignatureAttribute) classFileAttribute; if (checkMode(mode, SYSTEM | DETAILED)) { int minorVersion = classFileReader.getMinorVersion(); int majorVersion = classFileReader.getMajorVersion(); ? Messages.classfileformat_superflagisset : Messages.classfileformat_superflagisnotset) + (isDeprecated(classFileReader) ? ", deprecated" : org.eclipse.jdt.internal.compiler.util.Util.EMPTY_STRING)//$NON-NLS-1$ })); writeNewLine(buffer, lineSeparator, 0); if (signatureAttribute != null) { buffer.append(Messages.bind(Messages.disassembler_signatureattributeheader, new String(signatureAttribute.getSignature()))); writeNewLine(buffer, lineSeparator, 0); if (checkMode(mode, WORKING_COPY) && lastDotIndexInClassName != -1) { writeNewLine(buffer, lineSeparator, 0); if (checkMode(mode, DETAILED)) { disassembleAsModifier((IRuntimeInvisibleAnnotationsAttribute) runtimeInvisibleAnnotationsAttribute, buffer, lineSeparator, 0, mode); writeNewLine(buffer, lineSeparator, 0); disassembleAsModifier((IRuntimeVisibleAnnotationsAttribute) runtimeVisibleAnnotationsAttribute, buffer, lineSeparator, 0, mode); writeNewLine(buffer, lineSeparator, 0); if (isEnum && checkMode(mode, WORKING_COPY)) { decodeModifiersForType(buffer, accessFlags & IModifierConstants.ACC_PUBLIC);
writeNewLine(buffer, lineSeparator, tabNumber); final char[] fieldDescriptor = fieldInfo.getDescriptor(); final ISignatureAttribute signatureAttribute = (ISignatureAttribute) Util.getAttribute(fieldInfo, IAttributeNamesConstants.SIGNATURE); if (checkMode(mode, SYSTEM | DETAILED)) { buffer.append(Messages.bind(Messages.classfileformat_fieldddescriptor, new String[] { writeNewLine(buffer, lineSeparator, tabNumber); if (signatureAttribute != null) { buffer.append(Messages.bind(Messages.disassembler_signatureattributeheader, new String(signatureAttribute.getSignature()))); writeNewLine(buffer, lineSeparator, tabNumber); if (checkMode(mode, DETAILED)) { disassembleAsModifier((IRuntimeInvisibleAnnotationsAttribute) runtimeInvisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); disassembleAsModifier((IRuntimeVisibleAnnotationsAttribute) runtimeVisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); if (checkMode(mode, WORKING_COPY)) { decodeModifiersForFieldForWorkingCopy(buffer, fieldInfo.getAccessFlags()); if (signatureAttribute != null) { buffer.append(returnClassName(getSignatureForField(signatureAttribute.getSignature()), '.', mode)); } else { buffer.append(returnClassName(getSignatureForField(fieldDescriptor), '.', mode)); decodeModifiersForField(buffer, fieldInfo.getAccessFlags()); if (fieldInfo.isSynthetic()) {
writeNewLine(buffer, lineSeparator, tabNumber); final ICodeAttribute codeAttribute = methodInfo.getCodeAttribute(); final char[] methodDescriptor = methodInfo.getDescriptor(); final IClassFileAttribute methodParametersAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.METHOD_PARAMETERS); final IClassFileAttribute annotationDefaultAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.ANNOTATION_DEFAULT); if (checkMode(mode, SYSTEM | DETAILED)) { buffer.append(Messages.bind(Messages.classfileformat_methoddescriptor, new String[] { writeNewLine(buffer, lineSeparator, tabNumber); if (signatureAttribute != null) { buffer.append(Messages.bind(Messages.disassembler_signatureattributeheader, new String(signatureAttribute.getSignature()))); writeNewLine(buffer, lineSeparator, tabNumber); Integer.toString(codeAttribute.getMaxLocals()) })); writeNewLine(buffer, lineSeparator, tabNumber); if (checkMode(mode, DETAILED)) { disassembleAsModifier((IRuntimeInvisibleAnnotationsAttribute) runtimeInvisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); disassembleAsModifier((IRuntimeVisibleAnnotationsAttribute) runtimeVisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); decodeModifiersForMethod(buffer, accessFlags); if (methodInfo.isSynthetic() && !checkMode(mode, WORKING_COPY)) {
private void disassembleTypeMembers(IClassFileReader classFileReader, char[] className, StringBuffer buffer, String lineSeparator, int tabNumber, int mode, boolean isEnum) { IFieldInfo[] fields = classFileReader.getFieldInfos(); if (isEnum && checkMode(mode, WORKING_COPY)) { int index = 0; final int fieldsLength = fields.length; IMethodInfo[] methods = classFileReader.getMethodInfos(); char[][] constructorArguments = getConstructorArgumentsForEnum(methods); enumConstantLoop: for (; index < fieldsLength; index++) { final IFieldInfo fieldInfo = fields[index]; final int accessFlags = fieldInfo.getAccessFlags(); if ((accessFlags & IModifierConstants.ACC_ENUM) != 0) { writeNewLine(buffer, lineSeparator, tabNumber); disassembleEnumConstants(fields[index], buffer, lineSeparator, tabNumber, constructorArguments, mode); } else { break enumConstantLoop; writeNewLine(buffer, lineSeparator, tabNumber); disassemble(fields[index], buffer, lineSeparator, tabNumber, mode); CharOperation.replace(descriptor, '/', '.'); if (Signature.getParameterCount(descriptor) == 0) { if (CharOperation.equals(returnClassName(Signature.getReturnType(descriptor), '.', mode), CharOperation.concat(new char[] {'[', 'L'}, className, new char[] {';'}))) { continue methodLoop; if (parameterTypes.length == 1 && CharOperation.equals(parameterTypes[0], "Ljava.lang.String;".toCharArray())) { //$NON-NLS-1$ if (CharOperation.equals(returnClassName(Signature.getReturnType(descriptor), '.', mode), CharOperation.concat('L', className, ';'))) { continue methodLoop;
private void disassembleEnumConstructor(IClassFileReader classFileReader, char[] className, IMethodInfo methodInfo, StringBuffer buffer, String lineSeparator, int tabNumber, int mode) { writeNewLine(buffer, lineSeparator, tabNumber); final ICodeAttribute codeAttribute = methodInfo.getCodeAttribute(); char[] methodDescriptor = methodInfo.getDescriptor(); disassembleAsModifier((IRuntimeInvisibleAnnotationsAttribute) runtimeInvisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); disassembleAsModifier((IRuntimeVisibleAnnotationsAttribute) runtimeVisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); decodeModifiersForMethod(buffer, accessFlags & IModifierConstants.ACC_PRIVATE); CharOperation.replace(methodDescriptor, '/', '.'); final boolean isVarArgs = (accessFlags & IModifierConstants.ACC_VARARGS) != 0; final char[] signature = Signature.toCharArray(methodDescriptor, returnClassName(className, '.', COMPACT), getParameterNames(methodDescriptor, codeAttribute, accessFlags) , !checkMode(mode, COMPACT), false, isVarArgs); int index = CharOperation.indexOf(',', signature); index = CharOperation.indexOf(',', signature, index + 1); buffer.append(returnClassName(exceptionName, '.', mode)); switch(returnType[0]) { case 'V' : writeNewLine(buffer, lineSeparator, tabNumber); break; case 'I' : case 'S' : case 'C' : writeNewLine(buffer, lineSeparator, tabNumber + 1); buffer.append("return 0;"); //$NON-NLS-1$
private void disassemble(IInnerClassesAttribute innerClassesAttribute, StringBuffer buffer, String lineSeparator, int tabNumber) { writeNewLine(buffer, lineSeparator, tabNumber); buffer.append(Messages.disassembler_innerattributesheader); writeNewLine(buffer, lineSeparator, tabNumber + 1); IInnerClassesAttributeEntry[] innerClassesAttributeEntries = innerClassesAttribute.getInnerClassAttributesEntries(); int length = innerClassesAttributeEntries.length; if (i != 0) { buffer.append(Messages.disassembler_comma); writeNewLine(buffer, lineSeparator, tabNumber + 1); .append(innerClassesAttributeEntry.getOuterClassName()); writeNewLine(buffer, lineSeparator, tabNumber); dumpTab(tabNumber, buffer); buffer.append(Messages.disassembler_space); buffer .append(accessFlags) .append(Messages.disassembler_space); decodeModifiersForInnerClasses(buffer, accessFlags, true); buffer .append(Messages.disassembler_closeinnerclassentry);
case IAnnotationComponentValue.CHAR_TAG : temp.append('\''); escapeChar(temp, (char) constantPoolEntry.getIntegerValue()); temp.append('\''); break; break; case IConstantPoolConstant.CONSTANT_Utf8: value = "\"" + decodeStringValue(constantPoolEntry.getUtf8Value()) + "\"";//$NON-NLS-1$//$NON-NLS-2$ final char[] typeName = CharOperation.replaceOnCopy(annotationComponentValue.getEnumConstantTypeName(), '/', '.'); final char[] constantName = annotationComponentValue.getEnumConstantName(); buffer.append(returnClassName(Signature.toCharArray(typeName), '.', mode)).append('.').append(constantName); break; case IAnnotationComponentValue.CLASS_TAG: constantPoolEntry = annotationComponentValue.getClassInfo(); final char[] className = CharOperation.replaceOnCopy(constantPoolEntry.getUtf8Value(), '/', '.'); buffer.append(returnClassName(Signature.toCharArray(className), '.', mode)); break; case IAnnotationComponentValue.ANNOTATION_TAG: IAnnotation annotation = annotationComponentValue.getAnnotationValue(); disassembleAsModifier(annotation, buffer, lineSeparator, tabNumber + 1, mode); break; case IAnnotationComponentValue.ARRAY_TAG: buffer.append(','); disassembleAsModifier(annotationComponentValues[i], buffer, lineSeparator, tabNumber + 1, mode);
/** * @see Openable#openBuffer(IProgressMonitor, Object) */ protected IBuffer openBuffer(IProgressMonitor pm, Object info) throws JavaModelException { // create buffer IBuffer buffer = BufferManager.createBuffer(this); // set the buffer source IBuffer classFileBuffer = this.classFile.getBuffer(); if (classFileBuffer != null) { buffer.setContents(classFileBuffer.getCharacters()); } else { // Disassemble IClassFileReader reader = ToolFactory.createDefaultClassFileReader(this.classFile, IClassFileReader.ALL); Disassembler disassembler = new Disassembler(); String contents = disassembler.disassemble(reader, Util.getLineSeparator("", getJavaProject()), ClassFileBytesDisassembler.WORKING_COPY); //$NON-NLS-1$ buffer.setContents(contents); } // add buffer to buffer cache BufferManager bufManager = getBufferManager(); bufManager.addBuffer(buffer); // listen to buffer changes buffer.addBufferChangedListener(this); return buffer; }
public static String escapeString(String s) { return decodeStringValue(s); }
IClassFileAttribute classFileAttribute = Util.getAttribute(classFileReader, IAttributeNamesConstants.SIGNATURE); ISignatureAttribute signatureAttribute = (ISignatureAttribute) classFileAttribute; if (checkMode(mode, SYSTEM | DETAILED)) { int minorVersion = classFileReader.getMinorVersion(); int majorVersion = classFileReader.getMajorVersion(); ? Messages.classfileformat_superflagisset : Messages.classfileformat_superflagisnotset) + (isDeprecated(classFileReader) ? ", deprecated" : org.eclipse.jdt.internal.compiler.util.Util.EMPTY_STRING)//$NON-NLS-1$ })); writeNewLine(buffer, lineSeparator, 0); if (signatureAttribute != null) { buffer.append(Messages.bind(Messages.disassembler_signatureattributeheader, new String(signatureAttribute.getSignature()))); writeNewLine(buffer, lineSeparator, 0); if (checkMode(mode, WORKING_COPY) && lastDotIndexInClassName != -1) { writeNewLine(buffer, lineSeparator, 0); if (checkMode(mode, DETAILED)) { disassembleAsModifier((IRuntimeInvisibleAnnotationsAttribute) runtimeInvisibleAnnotationsAttribute, buffer, lineSeparator, 0, mode); writeNewLine(buffer, lineSeparator, 0); disassembleAsModifier((IRuntimeVisibleAnnotationsAttribute) runtimeVisibleAnnotationsAttribute, buffer, lineSeparator, 0, mode); writeNewLine(buffer, lineSeparator, 0); if (isEnum && checkMode(mode, WORKING_COPY)) { decodeModifiersForType(buffer, accessFlags & IModifierConstants.ACC_PUBLIC);
writeNewLine(buffer, lineSeparator, tabNumber); final char[] fieldDescriptor = fieldInfo.getDescriptor(); final ISignatureAttribute signatureAttribute = (ISignatureAttribute) Util.getAttribute(fieldInfo, IAttributeNamesConstants.SIGNATURE); if (checkMode(mode, SYSTEM | DETAILED)) { buffer.append(Messages.bind(Messages.classfileformat_fieldddescriptor, new String[] { writeNewLine(buffer, lineSeparator, tabNumber); if (signatureAttribute != null) { buffer.append(Messages.bind(Messages.disassembler_signatureattributeheader, new String(signatureAttribute.getSignature()))); writeNewLine(buffer, lineSeparator, tabNumber); final IClassFileAttribute runtimeVisibleTypeAnnotationsAttribute = Util.getAttribute(fieldInfo, IAttributeNamesConstants.RUNTIME_VISIBLE_TYPE_ANNOTATIONS); final IClassFileAttribute runtimeInvisibleTypeAnnotationsAttribute = Util.getAttribute(fieldInfo, IAttributeNamesConstants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS); if (checkMode(mode, DETAILED)) { disassembleAsModifier((IRuntimeInvisibleAnnotationsAttribute) runtimeInvisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); disassembleAsModifier((IRuntimeVisibleAnnotationsAttribute) runtimeVisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); if (checkMode(mode, WORKING_COPY)) { decodeModifiersForFieldForWorkingCopy(buffer, fieldInfo.getAccessFlags()); if (signatureAttribute != null) { buffer.append(returnClassName(getSignatureForField(signatureAttribute.getSignature()), '.', mode)); } else { buffer.append(returnClassName(getSignatureForField(fieldDescriptor), '.', mode));
writeNewLine(buffer, lineSeparator, tabNumber); final ICodeAttribute codeAttribute = methodInfo.getCodeAttribute(); final char[] methodDescriptor = methodInfo.getDescriptor(); final IClassFileAttribute methodParametersAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.METHOD_PARAMETERS); final IClassFileAttribute annotationDefaultAttribute = Util.getAttribute(methodInfo, IAttributeNamesConstants.ANNOTATION_DEFAULT); if (checkMode(mode, SYSTEM | DETAILED)) { buffer.append(Messages.bind(Messages.classfileformat_methoddescriptor, new String[] { writeNewLine(buffer, lineSeparator, tabNumber); if (signatureAttribute != null) { buffer.append(Messages.bind(Messages.disassembler_signatureattributeheader, new String(signatureAttribute.getSignature()))); writeNewLine(buffer, lineSeparator, tabNumber); Integer.toString(codeAttribute.getMaxLocals()) })); writeNewLine(buffer, lineSeparator, tabNumber); if (checkMode(mode, DETAILED)) { disassembleAsModifier((IRuntimeInvisibleAnnotationsAttribute) runtimeInvisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); disassembleAsModifier((IRuntimeVisibleAnnotationsAttribute) runtimeVisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); decodeModifiersForMethod(buffer, accessFlags); if (methodInfo.isSynthetic() && !checkMode(mode, WORKING_COPY)) {
private void disassembleTypeMembers(IClassFileReader classFileReader, char[] className, StringBuffer buffer, String lineSeparator, int tabNumber, int mode, boolean isEnum) { IFieldInfo[] fields = classFileReader.getFieldInfos(); if (isEnum && checkMode(mode, WORKING_COPY)) { int index = 0; final int fieldsLength = fields.length; IMethodInfo[] methods = classFileReader.getMethodInfos(); char[][] constructorArguments = getConstructorArgumentsForEnum(methods); enumConstantLoop: for (; index < fieldsLength; index++) { final IFieldInfo fieldInfo = fields[index]; final int accessFlags = fieldInfo.getAccessFlags(); if ((accessFlags & IModifierConstants.ACC_ENUM) != 0) { writeNewLine(buffer, lineSeparator, tabNumber); disassembleEnumConstants(fields[index], buffer, lineSeparator, tabNumber, constructorArguments, mode); } else { break enumConstantLoop; writeNewLine(buffer, lineSeparator, tabNumber); disassemble(fields[index], buffer, lineSeparator, tabNumber, mode); CharOperation.replace(descriptor, '/', '.'); if (Signature.getParameterCount(descriptor) == 0) { if (CharOperation.equals(returnClassName(Signature.getReturnType(descriptor), '.', mode), CharOperation.concat(new char[] {'[', 'L'}, className, new char[] {';'}))) { continue methodLoop; if (parameterTypes.length == 1 && CharOperation.equals(parameterTypes[0], "Ljava.lang.String;".toCharArray())) { //$NON-NLS-1$ if (CharOperation.equals(returnClassName(Signature.getReturnType(descriptor), '.', mode), CharOperation.concat('L', className, ';'))) { continue methodLoop;
private void disassembleEnumConstructor(IClassFileReader classFileReader, char[] className, IMethodInfo methodInfo, StringBuffer buffer, String lineSeparator, int tabNumber, int mode) { writeNewLine(buffer, lineSeparator, tabNumber); final ICodeAttribute codeAttribute = methodInfo.getCodeAttribute(); IMethodParametersAttribute methodParametersAttribute = (IMethodParametersAttribute) Util.getAttribute(methodInfo, IAttributeNamesConstants.METHOD_PARAMETERS); disassembleAsModifier((IRuntimeInvisibleAnnotationsAttribute) runtimeInvisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); disassembleAsModifier((IRuntimeVisibleAnnotationsAttribute) runtimeVisibleAnnotationsAttribute, buffer, lineSeparator, tabNumber, mode); writeNewLine(buffer, lineSeparator, tabNumber); decodeModifiersForMethod(buffer, accessFlags & IModifierConstants.ACC_PRIVATE); CharOperation.replace(methodDescriptor, '/', '.'); final boolean isVarArgs = (accessFlags & IModifierConstants.ACC_VARARGS) != 0; final char[] signature = Signature.toCharArray(methodDescriptor, returnClassName(className, '.', COMPACT), getParameterNames(methodDescriptor, codeAttribute, methodParametersAttribute, accessFlags) , !checkMode(mode, COMPACT), false, isVarArgs); int index = CharOperation.indexOf(',', signature); index = CharOperation.indexOf(',', signature, index + 1); buffer.append(returnClassName(exceptionName, '.', mode)); switch(returnType[0]) { case 'V' : writeNewLine(buffer, lineSeparator, tabNumber); break; case 'I' : case 'S' : case 'C' : writeNewLine(buffer, lineSeparator, tabNumber + 1); buffer.append("return 0;"); //$NON-NLS-1$
private void disassemble(IInnerClassesAttribute innerClassesAttribute, StringBuffer buffer, String lineSeparator, int tabNumber) { writeNewLine(buffer, lineSeparator, tabNumber); buffer.append(Messages.disassembler_innerattributesheader); writeNewLine(buffer, lineSeparator, tabNumber + 1); IInnerClassesAttributeEntry[] innerClassesAttributeEntries = innerClassesAttribute.getInnerClassAttributesEntries(); int length = innerClassesAttributeEntries.length; if (i != 0) { buffer.append(Messages.disassembler_comma); writeNewLine(buffer, lineSeparator, tabNumber + 1); .append(innerClassesAttributeEntry.getOuterClassName()); writeNewLine(buffer, lineSeparator, tabNumber); dumpTab(tabNumber, buffer); buffer.append(Messages.disassembler_space); buffer .append(accessFlags) .append(Messages.disassembler_space); decodeModifiersForInnerClasses(buffer, accessFlags, true); buffer .append(Messages.disassembler_closeinnerclassentry);
case IAnnotationComponentValue.CHAR_TAG : temp.append('\''); escapeChar(temp, (char) constantPoolEntry.getIntegerValue()); temp.append('\''); break; break; case IConstantPoolConstant.CONSTANT_Utf8: value = "\"" + decodeStringValue(constantPoolEntry.getUtf8Value()) + "\"";//$NON-NLS-1$//$NON-NLS-2$ final char[] typeName = CharOperation.replaceOnCopy(annotationComponentValue.getEnumConstantTypeName(), '/', '.'); final char[] constantName = annotationComponentValue.getEnumConstantName(); buffer.append(returnClassName(Signature.toCharArray(typeName), '.', mode)).append('.').append(constantName); break; case IAnnotationComponentValue.CLASS_TAG: constantPoolEntry = annotationComponentValue.getClassInfo(); final char[] className = CharOperation.replaceOnCopy(constantPoolEntry.getUtf8Value(), '/', '.'); buffer.append(returnClassName(Signature.toCharArray(className), '.', mode)); break; case IAnnotationComponentValue.ANNOTATION_TAG: IAnnotation annotation = annotationComponentValue.getAnnotationValue(); disassembleAsModifier(annotation, buffer, lineSeparator, tabNumber + 1, mode); break; case IAnnotationComponentValue.ARRAY_TAG: buffer.append(','); disassembleAsModifier(annotationComponentValues[i], buffer, lineSeparator, tabNumber + 1, mode);
Disassembler disassembler = new Disassembler(); String contents = disassembler.disassemble(reader, Util.getLineSeparator("", getJavaProject()), ClassFileBytesDisassembler.WORKING_COPY); //$NON-NLS-1$ buffer.setContents(contents);