OSDN Git Service

refactoring.
authoriga <tosiki.iga@nifty.ne.jp>
Sun, 30 Mar 2014 12:59:44 +0000 (21:59 +0900)
committeriga <tosiki.iga@nifty.ne.jp>
Sun, 30 Mar 2014 12:59:44 +0000 (21:59 +0900)
jcfa/src/jp/igapyon/jcfa/JavaClassFileAnalyzer.java

index c01bb1e..34d8ec5 100644 (file)
@@ -30,111 +30,8 @@ public class JavaClassFileAnalyzer {
 \r
                        analyzeFields(jc);\r
 \r
-                       final org.apache.bcel.classfile.Method[] methods = jc.getMethods();\r
-                       for (int indexMethod = 0; indexMethod < methods.length; indexMethod++) {\r
-                               final Method method = methods[indexMethod];\r
-                               System.out.println("  Method:" + method.getName());\r
-                               final Code code = method.getCode();\r
-                               if (code == null) {\r
-                                       continue;\r
-                               }\r
-\r
-                               final byte[] codes = code.getCode();\r
-                               for (int pc = 0; pc < codes.length; pc++) {\r
-                                       final short opcode = JcfaUtil.byte2UnsignedByte(codes[pc]);\r
-                                       short operands = Constants.NO_OF_OPERANDS[opcode];\r
-                                       if (operands < 0) {\r
-                                               System.out.println("  TODO negative value:"\r
-                                                               + Constants.OPCODE_NAMES[opcode] + ": "\r
-                                                               + operands);\r
-                                               // break;\r
-                                       }\r
+                       analyzeMethods(jc);\r
 \r
-                                       switch (opcode) {\r
-                                       case Constants.RETURN: {\r
-                                               System.out.println("    " + pc + ": "\r
-                                                               + Constants.OPCODE_NAMES[opcode]);\r
-                                               break;\r
-                                       }\r
-                                       case Constants.GETSTATIC: {\r
-                                               System.out.println("    "\r
-                                                               + pc\r
-                                                               + ": "\r
-                                                               + Constants.OPCODE_NAMES[opcode]\r
-                                                               + ": "\r
-                                                               + JcfaUtil.getConstantFieldrefString(jc,\r
-                                                                               codes[pc + 1], codes[pc + 2]));\r
-                                               break;\r
-                                       }\r
-                                       case Constants.LDC: {\r
-                                               System.out\r
-                                                               .println("    "\r
-                                                                               + pc\r
-                                                                               + ": "\r
-                                                                               + Constants.OPCODE_NAMES[opcode]\r
-                                                                               + ": "\r
-                                                                               + JcfaUtil.getConstantString(jc,\r
-                                                                                               codes[pc + 1]));\r
-                                       }\r
-                                               break;\r
-                                       case Constants.INVOKEVIRTUAL:\r
-                                       case Constants.INVOKESPECIAL: {\r
-                                               final int operand = JcfaUtil.byte2UnsignedShort(\r
-                                                               codes[pc + 1], codes[pc + 2]);\r
-                                               System.out.println("    "\r
-                                                               + pc\r
-                                                               + ": "\r
-                                                               + Constants.OPCODE_NAMES[opcode]\r
-                                                               + ": "\r
-                                                               + JcfaUtil.getConstantMethodRefString(jc,\r
-                                                                               operand));\r
-                                       }\r
-                                               break;\r
-                                       case Constants.LOOKUPSWITCH:\r
-                                               int result = JcfaUtil.byte2Int(codes[pc + 1],\r
-                                                               codes[pc + 2], codes[pc + 3], codes[pc + 4]);\r
-                                               System.out\r
-                                                               .println("  TODO skipping bytes: " + (result));\r
-\r
-                                               int lookupOp = pc + 5;\r
-\r
-                                               short diff = JcfaUtil\r
-                                                               .byte2UnsignedByte(codes[lookupOp++]);\r
-                                               System.out.println("  TODO skipping bytes: " + (diff));\r
-\r
-                                               int loopCount = JcfaUtil.byte2Int(codes[lookupOp++],\r
-                                                               codes[lookupOp++], codes[lookupOp++],\r
-                                                               codes[lookupOp++]);\r
-                                               for (int index = 0; index < loopCount; index++) {\r
-                                                       System.out.println("      "\r
-                                                                       + JcfaUtil.byte2Int(codes[lookupOp++],\r
-                                                                                       codes[lookupOp++],\r
-                                                                                       codes[lookupOp++],\r
-                                                                                       codes[lookupOp++])\r
-                                                                       + ":"\r
-                                                                       + (JcfaUtil.byte2Int(codes[lookupOp++],\r
-                                                                                       codes[lookupOp++],\r
-                                                                                       codes[lookupOp++],\r
-                                                                                       codes[lookupOp++]) + pc));\r
-                                               }\r
-\r
-                                               short diff2 = JcfaUtil\r
-                                                               .byte2UnsignedByte(codes[lookupOp++]);\r
-                                               System.out.println("  TODO skipping bytes: " + (diff2));\r
-\r
-                                               operands += (lookupOp - pc);\r
-\r
-                                               break;\r
-                                       default: {\r
-                                               System.out.println("    " + pc + ": "\r
-                                                               + Constants.OPCODE_NAMES[opcode] + " ("\r
-                                                               + operands + ")");\r
-                                       }\r
-                                               break;\r
-                                       }\r
-                                       pc += operands;\r
-                               }\r
-                       }\r
                } catch (ClassFormatException e) {\r
                        e.printStackTrace();\r
                } catch (IOException e) {\r
@@ -156,4 +53,97 @@ public class JavaClassFileAnalyzer {
                        System.out.println("    " + field.getSignature());\r
                }\r
        }\r
+\r
+       private void analyzeMethods(final JavaClass jc) throws IOException {\r
+               final org.apache.bcel.classfile.Method[] methods = jc.getMethods();\r
+               for (int indexMethod = 0; indexMethod < methods.length; indexMethod++) {\r
+                       final Method method = methods[indexMethod];\r
+                       System.out.println("  Method:" + method.getName());\r
+                       final Code code = method.getCode();\r
+                       if (code == null) {\r
+                               continue;\r
+                       }\r
+\r
+                       final byte[] codes = code.getCode();\r
+                       for (int pc = 0; pc < codes.length; pc++) {\r
+                               final short opcode = JcfaUtil.byte2UnsignedByte(codes[pc]);\r
+                               short operands = Constants.NO_OF_OPERANDS[opcode];\r
+                               if (operands < 0) {\r
+                                       System.out.println("  TODO negative value:"\r
+                                                       + Constants.OPCODE_NAMES[opcode] + ": " + operands);\r
+                                       // break;\r
+                               }\r
+\r
+                               switch (opcode) {\r
+                               case Constants.RETURN: {\r
+                                       System.out.println("    " + pc + ": "\r
+                                                       + Constants.OPCODE_NAMES[opcode]);\r
+                                       break;\r
+                               }\r
+                               case Constants.GETSTATIC: {\r
+                                       System.out.println("    "\r
+                                                       + pc\r
+                                                       + ": "\r
+                                                       + Constants.OPCODE_NAMES[opcode]\r
+                                                       + ": "\r
+                                                       + JcfaUtil.getConstantFieldrefString(jc,\r
+                                                                       codes[pc + 1], codes[pc + 2]));\r
+                                       break;\r
+                               }\r
+                               case Constants.LDC: {\r
+                                       System.out.println("    " + pc + ": "\r
+                                                       + Constants.OPCODE_NAMES[opcode] + ": "\r
+                                                       + JcfaUtil.getConstantString(jc, codes[pc + 1]));\r
+                               }\r
+                                       break;\r
+                               case Constants.INVOKEVIRTUAL:\r
+                               case Constants.INVOKESPECIAL: {\r
+                                       final int operand = JcfaUtil.byte2UnsignedShort(\r
+                                                       codes[pc + 1], codes[pc + 2]);\r
+                                       System.out.println("    " + pc + ": "\r
+                                                       + Constants.OPCODE_NAMES[opcode] + ": "\r
+                                                       + JcfaUtil.getConstantMethodRefString(jc, operand));\r
+                               }\r
+                                       break;\r
+                               case Constants.LOOKUPSWITCH:\r
+                                       int result = JcfaUtil.byte2Int(codes[pc + 1],\r
+                                                       codes[pc + 2], codes[pc + 3], codes[pc + 4]);\r
+                                       System.out.println("  TODO skipping bytes: " + (result));\r
+\r
+                                       int lookupOp = pc + 5;\r
+\r
+                                       short diff = JcfaUtil.byte2UnsignedByte(codes[lookupOp++]);\r
+                                       System.out.println("  TODO skipping bytes: " + (diff));\r
+\r
+                                       int loopCount = JcfaUtil.byte2Int(codes[lookupOp++],\r
+                                                       codes[lookupOp++], codes[lookupOp++],\r
+                                                       codes[lookupOp++]);\r
+                                       for (int index = 0; index < loopCount; index++) {\r
+                                               System.out.println("      "\r
+                                                               + JcfaUtil.byte2Int(codes[lookupOp++],\r
+                                                                               codes[lookupOp++], codes[lookupOp++],\r
+                                                                               codes[lookupOp++])\r
+                                                               + ":"\r
+                                                               + (JcfaUtil.byte2Int(codes[lookupOp++],\r
+                                                                               codes[lookupOp++], codes[lookupOp++],\r
+                                                                               codes[lookupOp++]) + pc));\r
+                                       }\r
+\r
+                                       short diff2 = JcfaUtil.byte2UnsignedByte(codes[lookupOp++]);\r
+                                       System.out.println("  TODO skipping bytes: " + (diff2));\r
+\r
+                                       operands += (lookupOp - pc);\r
+\r
+                                       break;\r
+                               default: {\r
+                                       System.out.println("    " + pc + ": "\r
+                                                       + Constants.OPCODE_NAMES[opcode] + " (" + operands\r
+                                                       + ")");\r
+                               }\r
+                                       break;\r
+                               }\r
+                               pc += operands;\r
+                       }\r
+               }\r
+       }\r
 }
\ No newline at end of file