From a90417430a77e288187a56f85d05578a83b6594a Mon Sep 17 00:00:00 2001 From: iga Date: Sun, 30 Mar 2014 22:02:48 +0900 Subject: [PATCH] refactoring. --- .../src/jp/igapyon/jcfa/JavaClassFileAnalyzer.java | 190 +++++++++++---------- 1 file changed, 99 insertions(+), 91 deletions(-) diff --git a/jcfa/src/jp/igapyon/jcfa/JavaClassFileAnalyzer.java b/jcfa/src/jp/igapyon/jcfa/JavaClassFileAnalyzer.java index 34d8ec5..2d98765 100644 --- a/jcfa/src/jp/igapyon/jcfa/JavaClassFileAnalyzer.java +++ b/jcfa/src/jp/igapyon/jcfa/JavaClassFileAnalyzer.java @@ -29,9 +29,7 @@ public class JavaClassFileAnalyzer { System.out.println("Parent class: " + jc.getSuperclassName()); analyzeFields(jc); - analyzeMethods(jc); - } catch (ClassFormatException e) { e.printStackTrace(); } catch (IOException e) { @@ -43,107 +41,117 @@ public class JavaClassFileAnalyzer { final org.apache.bcel.classfile.Field[] fields = jc.getFields(); for (int indexField = 0; indexField < fields.length; indexField++) { final Field field = fields[indexField]; - System.out.println(" Field:" + field.getName()); - String access = ""; - access += field.isPublic() ? "public " : ""; - access += field.isAbstract() ? "abstract " : ""; - access += field.isStatic() ? "static " : ""; - access += field.isFinal() ? "final " : ""; - System.out.println(" " + access); - System.out.println(" " + field.getSignature()); + analyzeField(jc, field); } } + private void analyzeField(final JavaClass jc, final Field field) { + System.out.println(" Field:" + field.getName()); + String access = ""; + access += field.isPublic() ? "public " : ""; + access += field.isAbstract() ? "abstract " : ""; + access += field.isStatic() ? "static " : ""; + access += field.isFinal() ? "final " : ""; + System.out.println(" " + access); + System.out.println(" " + field.getSignature()); + } + private void analyzeMethods(final JavaClass jc) throws IOException { final org.apache.bcel.classfile.Method[] methods = jc.getMethods(); for (int indexMethod = 0; indexMethod < methods.length; indexMethod++) { final Method method = methods[indexMethod]; - System.out.println(" Method:" + method.getName()); - final Code code = method.getCode(); - if (code == null) { - continue; + analyzeMethod(jc, method); + + } + } + + private void analyzeMethod(final JavaClass jc, final Method method) + throws IOException { + System.out.println(" Method:" + method.getName()); + final Code code = method.getCode(); + if (code == null) { + return; + } + + final byte[] codes = code.getCode(); + for (int pc = 0; pc < codes.length; pc++) { + final short opcode = JcfaUtil.byte2UnsignedByte(codes[pc]); + short operands = Constants.NO_OF_OPERANDS[opcode]; + if (operands < 0) { + System.out.println(" TODO negative value:" + + Constants.OPCODE_NAMES[opcode] + ": " + operands); + // break; } - final byte[] codes = code.getCode(); - for (int pc = 0; pc < codes.length; pc++) { - final short opcode = JcfaUtil.byte2UnsignedByte(codes[pc]); - short operands = Constants.NO_OF_OPERANDS[opcode]; - if (operands < 0) { - System.out.println(" TODO negative value:" - + Constants.OPCODE_NAMES[opcode] + ": " + operands); - // break; + switch (opcode) { + case Constants.RETURN: { + System.out.println(" " + pc + ": " + + Constants.OPCODE_NAMES[opcode]); + break; + } + case Constants.GETSTATIC: { + System.out.println(" " + + pc + + ": " + + Constants.OPCODE_NAMES[opcode] + + ": " + + JcfaUtil.getConstantFieldrefString(jc, codes[pc + 1], + codes[pc + 2])); + break; + } + case Constants.LDC: { + System.out.println(" " + pc + ": " + + Constants.OPCODE_NAMES[opcode] + ": " + + JcfaUtil.getConstantString(jc, codes[pc + 1])); + } + break; + case Constants.INVOKEVIRTUAL: + case Constants.INVOKESPECIAL: { + final int operand = JcfaUtil.byte2UnsignedShort(codes[pc + 1], + codes[pc + 2]); + System.out.println(" " + pc + ": " + + Constants.OPCODE_NAMES[opcode] + ": " + + JcfaUtil.getConstantMethodRefString(jc, operand)); + } + break; + case Constants.LOOKUPSWITCH: + int result = JcfaUtil.byte2Int(codes[pc + 1], codes[pc + 2], + codes[pc + 3], codes[pc + 4]); + System.out.println(" TODO skipping bytes: " + (result)); + + int lookupOp = pc + 5; + + short diff = JcfaUtil.byte2UnsignedByte(codes[lookupOp++]); + System.out.println(" TODO skipping bytes: " + (diff)); + + int loopCount = JcfaUtil + .byte2Int(codes[lookupOp++], codes[lookupOp++], + codes[lookupOp++], codes[lookupOp++]); + for (int index = 0; index < loopCount; index++) { + System.out.println(" " + + JcfaUtil.byte2Int(codes[lookupOp++], + codes[lookupOp++], codes[lookupOp++], + codes[lookupOp++]) + + ":" + + (JcfaUtil.byte2Int(codes[lookupOp++], + codes[lookupOp++], codes[lookupOp++], + codes[lookupOp++]) + pc)); } - switch (opcode) { - case Constants.RETURN: { - System.out.println(" " + pc + ": " - + Constants.OPCODE_NAMES[opcode]); - break; - } - case Constants.GETSTATIC: { - System.out.println(" " - + pc - + ": " - + Constants.OPCODE_NAMES[opcode] - + ": " - + JcfaUtil.getConstantFieldrefString(jc, - codes[pc + 1], codes[pc + 2])); - break; - } - case Constants.LDC: { - System.out.println(" " + pc + ": " - + Constants.OPCODE_NAMES[opcode] + ": " - + JcfaUtil.getConstantString(jc, codes[pc + 1])); - } - break; - case Constants.INVOKEVIRTUAL: - case Constants.INVOKESPECIAL: { - final int operand = JcfaUtil.byte2UnsignedShort( - codes[pc + 1], codes[pc + 2]); - System.out.println(" " + pc + ": " - + Constants.OPCODE_NAMES[opcode] + ": " - + JcfaUtil.getConstantMethodRefString(jc, operand)); - } - break; - case Constants.LOOKUPSWITCH: - int result = JcfaUtil.byte2Int(codes[pc + 1], - codes[pc + 2], codes[pc + 3], codes[pc + 4]); - System.out.println(" TODO skipping bytes: " + (result)); - - int lookupOp = pc + 5; - - short diff = JcfaUtil.byte2UnsignedByte(codes[lookupOp++]); - System.out.println(" TODO skipping bytes: " + (diff)); - - int loopCount = JcfaUtil.byte2Int(codes[lookupOp++], - codes[lookupOp++], codes[lookupOp++], - codes[lookupOp++]); - for (int index = 0; index < loopCount; index++) { - System.out.println(" " - + JcfaUtil.byte2Int(codes[lookupOp++], - codes[lookupOp++], codes[lookupOp++], - codes[lookupOp++]) - + ":" - + (JcfaUtil.byte2Int(codes[lookupOp++], - codes[lookupOp++], codes[lookupOp++], - codes[lookupOp++]) + pc)); - } - - short diff2 = JcfaUtil.byte2UnsignedByte(codes[lookupOp++]); - System.out.println(" TODO skipping bytes: " + (diff2)); - - operands += (lookupOp - pc); - - break; - default: { - System.out.println(" " + pc + ": " - + Constants.OPCODE_NAMES[opcode] + " (" + operands - + ")"); - } - break; - } - pc += operands; + short diff2 = JcfaUtil.byte2UnsignedByte(codes[lookupOp++]); + System.out.println(" TODO skipping bytes: " + (diff2)); + + operands += (lookupOp - pc); + + break; + default: { + System.out.println(" " + pc + ": " + + Constants.OPCODE_NAMES[opcode] + " (" + operands + + ")"); + } + break; } + pc += operands; } } } \ No newline at end of file -- 2.11.0