2014-01-24 6 views
5

Ich arbeite an einem Projekt, das die Anzahl der Getter und Setter in einem kompilierten Java-Code zählen muss. Ich bin neu und weiß nicht wo und wie ich anfangen soll. Ich habe Eclipse installiert und das Bytecode-Plugin hinzugefügt, um den Bytecode des Java-Codes zu sehen.Zählen von Gettern und Setter

Irgendwelche Gedanken darüber, was ich als nächstes tun muss?

+3

Wie 'Java' und' Assembly' Tags hier zu tun? –

+5

Sie wollen Reflexion verwenden. Was hast du probiert? – Romski

+0

+1 für die Verwendung von Reflexion. –

Antwort

3

Siehe die Apache-Bytecode-Manipulationsbibliothek BCEL. Die Byte-Code-Engineering-Bibliothek soll Benutzern eine bequeme Möglichkeit zum Analysieren, Erstellen und Bearbeiten von (binären) Java-Klassendateien (mit Endung .class) bieten.

Danach können Sie Reflektion verwenden, um die Zählung wie folgt zu erhalten:

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

Sie java.lang.reflect.* Paket können alle die Klasse Informationen, wie zB Variable, Methoden, Konstruktoren zu bekommen und innere Klassen.

Beispiel:

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; 
} 

den gleichen Ansatz für Setter Folgen, eine Sache, die Sie beachten müssen, ist boolean Getter sie in der Regel mit is statt get beginnt.

+0

+1 für das Beispiel – SpringLearner

+0

+1 für einfache Lösung –

4

können Sie Class.getDeclaredMethods() verwenden, mit so etwas wie dieses

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

Wie wäre es mit ASM, getfield/putfield-Anweisungen zu zählen, ist das möglich? – user2214408

+0

Was fragst du? [Jasmin] (http://en.wikipedia.org/wiki/Jasmin_%28Java_assembler%29)? –