📄 gnubytecodejavap.java
字号:
if ((flags & Access.PROTECTED) != 0) { buf.append("protected "); if (!isShowProtected()) { field = field.getNext(); continue; } } if ((flags & Access.STATIC) != 0) buf.append("static "); if ((flags & Access.FINAL) != 0) buf.append("final "); if ((flags & Access.SYNCHRONIZED) != 0) buf.append("synchronized "); if ((flags & Access.VOLATILE) != 0) buf.append("volatile "); if ((flags & Access.TRANSIENT) != 0) buf.append("transient "); if ((flags & Access.NATIVE) != 0) buf.append("native "); if ((flags & Access.ABSTRACT) != 0) buf.append("abstract "); if ((flags & Access.INTERFACE) != 0) buf.append("interface "); String fieldtypename = field.getType().getName(); fieldtypename = escapeInnerClass(fieldtypename); buf.append(fieldtypename); buf.append(" "); buf.append(field.getSourceName()); buf.append(";"); out.println(buf.toString()); if (isPrintSignatures()) { buf = new StringBuffer(); buf.append(TABBING); buf.append(TAB); buf.append(COMMENT_START); buf.append(field.getSignature()); buf.append(COMMENT_END); out.println(buf.toString()); } field = field.getNext(); } // output methods buf = null; Method method = classType.getMethods(); while (method != null) { buf = new StringBuffer(); buf.append(TABBING); flags = 1; flags |= MODIFIERS | EXCEPTIONS | WITHSEMICOLON; String methodStr = getMethod(classType, method, flags); if (methodStr == null) { method = method.getNext(); continue; } buf.append(getMethod(classType, method, flags)); out.println(buf.toString()); buf = null; if (isPrintSignatures()) { buf = new StringBuffer(); buf.append(TABBING); buf.append(TAB); buf.append(COMMENT_START); buf.append(method.getSignature()); buf.append(COMMENT_END); out.println(buf.toString()); buf = null; } if (isPrintStackSize() || isPrintNumberLocals() || isPrintMethodArgs()) { CodeAttr code = method.getCode(); if (code != null) { buf = new StringBuffer(); buf.append(TABBING); buf.append(TAB); buf.append(COMMENT_START); if (isPrintStackSize()) { buf.append("Stack="); buf.append(code.getMaxStack()); } if (isPrintNumberLocals()) { if (isPrintStackSize()) buf.append(", "); buf.append("Locals="); buf.append(code.getMaxLocals()); } if (isPrintMethodArgs()) { if (isPrintStackSize() || isPrintNumberLocals()) buf.append(", "); buf.append("Args_size="); Type[] paramTypes = method.getParameterTypes(); String methodName = method.getName(); int add = 1; if (methodName.equals("<clinit>")) add = 0; int args = paramTypes.length + add; buf.append(args); } buf.append(COMMENT_END); out.println(buf.toString()); buf = null; } } method = method.getNext(); } InnerClassesAttr innerClassAttr = (InnerClassesAttr) Attribute .get(classType, "InnerClasses"); if (innerClassAttr != null) { // String[][] innerClassNames = innerClassAttr.getClassNames(); String[][] innerClassNames = new String[0][0]; // System.out.println (TABBING + "DBG: " + classType.getName () + " // THIS"); // for (int i = 0; i < innerClassNames.length; i++) // { // System.out.println (TABBING + "DBG: " + innerClassNames[i][0]); // } TABBING = TABBING + TAB; CLASS_TABBING = CLASS_TABBING + TAB; for (int i = 0; i < innerClassNames.length; i++) { String tclassName = innerClassNames[i][0]; tclassName = tclassName.replace('/', '.'); if (tclassName.indexOf(classType.getName()) == -1) continue; if (tclassName.length() <= classType.getName().length()) continue; String test = escapeInnerClass(tclassName); if (test.indexOf('$') != -1) continue; InputStream is = null; try { is = findClass(innerClassNames[i][0]); } catch (ClassNotFoundException e) { System.err.println("Class '" + innerClassNames[i][0] + "' not found"); continue; } try { ClassType innerclassType = ClassFileInput.readClassType(is); flags = innerclassType.getModifiers(); StringTokenizer st = new StringTokenizer(innerClassNames[i][1]); while (st.hasMoreTokens()) { String token = st.nextToken(); if (token.equals("public")) flags |= Access.PUBLIC; else if (token.equals("private")) flags |= Access.PRIVATE; else if (token.equals("protected")) flags |= Access.PROTECTED; else if (token.equals("static")) flags |= Access.STATIC; else if (token.equals("final")) flags |= Access.FINAL; else if (token.equals("abstract")) flags |= Access.ABSTRACT; else if (token.equals("interface")) flags |= Access.INTERFACE; } innerclassType.setModifiers(flags); // generateOutput(innerclassType, out); } catch (ClassFormatError cfe) { System.err.println("Error: " + innerClassNames[i][0] + ": " + cfe.getMessage()); } catch (IOException ioe) { System.err.println("Error: " + innerClassNames[i][0] + ": " + ioe.getMessage()); } } TABBING = TABBING.substring(0, TABBING.length() - TAB.length()); CLASS_TABBING = CLASS_TABBING.substring(0, CLASS_TABBING.length() - TAB.length()); } // end of class out.println(CLASS_TABBING + "}"); method = classType.getMethods(); while (method != null) { if (isDisassemble() || isPrintLineNumbers() || isPrintLocalVariables()) { try { CodeAttr code = (CodeAttr) Attribute.get(method, "Code"); if (code != null) { if (isDisassemble()) { buf = new StringBuffer(); String methodStr = getMethod(classType, method, 0); if (methodStr != null) { buf.append("Method "); buf.append(methodStr); out.println(""); out.println(buf.toString()); } int offset = 0; int length = code.getCodeLength(); buf = new StringBuffer(); ClassTypeWriter writer = getClassTypeWriter(buf, classType); code.disAssemble(writer, offset, length); writer.flush(); writer.close(); // swriter is set in getClasTypeWriter if (swriter != null) out.print(swriter.toString()); } if (isPrintLineNumbers()) { LineNumbersAttr lineNumbers = (LineNumbersAttr) Attribute .get(code, "LineNumberTable"); if (lineNumbers != null) { buf = new StringBuffer(); String methodStr = getMethod(classType, method, 0); if (methodStr != null) { buf.append("Line numbers for method "); buf.append(methodStr); out.println(""); out.println(buf.toString()); int linenumber_count = lineNumbers .getLineCount(); short[] linenumber_table = lineNumbers .getLineNumberTable(); for (int i = 0; i < linenumber_count; i++) { out.print(" line "); out .print(linenumber_table[2 * i + 1] & 0xFFFF); out.print(": "); out .println(linenumber_table[2 * i] & 0xFFFF); } } } } if (isPrintLocalVariables()) { try { LocalVarsAttr vars = (LocalVarsAttr) Attribute .get(code, "LocalVariableTable"); if (vars != null) { buf = new StringBuffer(); String methodStr = getMethod(classType, method, 0); if (methodStr != null) { buf.append("Local variables for method "); buf.append(methodStr); out.println(""); out.println(buf.toString()); VarEnumerator varEnum = vars.allVars(); Variable var = varEnum.nextVar(); while (var != null) { buf = new StringBuffer(); buf.append(" "); buf.append(var.getType().getName()); buf.append(" "); buf.append(var.getName()); buf.append(" pc="); // buf.append(var.getStartPC()); buf.append(", length="); // buf.append(var.getEndPC() - // var.getStartPC()); buf.append(", slot="); // buf.append(var.getOffset()); out.println(buf.toString()); var = varEnum.nextVar(); } } } } catch (ClassCastException cce) { } } } // if (code != null) } catch (ClassCastException cce) { } } method = method.getNext(); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -