2014-01-24 107 views
5

我正在研究一個需要計算編譯的java代碼中吸氣器和吸氣器數量的項目。我是新手,不知道在哪裏以及如何開始。 我已經安裝了eclipse並添加了Bytecode插件來查看java代碼的字節碼。計數吸氣器和吸氣器

關於接下來我需要做什麼的想法?

+3

如何'Java'和'Assembly'標籤這裏有關係嗎? –

+5

你會想要使用反射。你有什麼嘗試? – Romski

+0

+1用於反射。 –

回答

3

請參閱Apache字節碼操作庫BCEL。 字節代碼工程庫旨在爲用戶提供一種便捷的方式來分析,創建和操作(二進制)Java類文件(以.class結尾的文件)。

那之後,你可以使用反射來獲取計數這樣的:

public static int getGetterMethodCount(Class<?> cls) { 
    int n = 0; 
    for (Method m : cls.getMethods()) { 
     // To identify the boolean setter "is" is used 
     if (m.getName().startsWith("get") || m.getName().startsWith("is")) { 
      n++; 
     } 
    } 
    return n; 
} 

public static int getSetterMethodCount(Class<?> cls) { 
    int n = 0; 
    for (Method m : cls.getMethods()) { 
     if (m.getName().startsWith("set")) { 
      n++; 
     } 
    } 
    return n; 
} 
8

您可以使用java.lang.reflect.*包讓所有的類信息,如變量,方法,構造和內部類。

例子:

public int noOfGettersOf(Class clazz) { 
    int noOfGetters = 0; 
    Method[] methods = clazz.getDeclaredMethods() 
    for(Method method : methods) { 
     String methodName = method.getName(); 
     if(methodName.startsWith("get") || methodName.startsWith("is")) { 
      noOfGetters++; 
     } 
    } 
    return noOfGetters; 
} 

遵循制定者同樣的方法,有一點你需要考慮的是,他們通常與is代替get開始布爾干將。

+0

+1示例 – SpringLearner

+0

+1簡單解決方案 –

4

您可以使用Class.getDeclaredMethods(),像這樣的東西

public static int countGets(Class<?> cls) { 
    int c = 0; 
    for (java.lang.reflect.Method m : cls.getMethods()) { 
    if (m.getName().startsWith("get")) { 
     c++; 
    } 
    } 
    return c; 
} 

public static int countSets(Class<?> cls) { 
    int c = 0; 
    for (java.lang.reflect.Method m : cls.getMethods()) { 
    if (m.getName().startsWith("set")) { 
     c++; 
    } 
    } 
    return c; 
} 
+0

如何使用ASM來計算getfield/putfield指令,這可能嗎? – user2214408

+0

你在問什麼? [茉莉](http://en.wikipedia.org/wiki/Jasmin_%28Java_assembler%29)? –