Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to count number of methods per java class using c sharp?

Tags:

c#

regex

I have to complete a project in C# to find number of methods per java class.

I could find all methods in the .java file using c# regular expression, but what I want is to find the number of methods per each and every class, including inner classes. Can any one help me.

string[] lines = File.ReadAllLines(file);

int countLine = 0;
int AllCount = 0;

foreach (string line in lines)
{

    countLine = MethodsCount(line);
    AllCount = AllCount + countLine;

}

label5.Text = AllCount.ToString();

Here's the method-counting method.

private int MethodsCount (string LineOperator)
{
    int count = 0;

    string[] words = LineOperator.Split('{');

    foreach (string word in words)
    {
        if (Regex.IsMatch(word, @"(static\s|final\s)?(public|private|internal)(\sstatic|\sfinal)?\s(int|boolean|void|double|String|long|String\[\]|String\[\]\[\])?\s([a-z]|[A-Z]+[a-z]+|[a-z]+[A-Z]+)+(\s)*\((\s|\n|\r)*"))
        {
            count = count + 1;
        }
    }

    return count;
}

if we consider a class

public class vehicle {

    public method1() {
       ---------
    }

    public method2() {
       ------
    }

    public class car extends vehicle {
        public method3() {
            -------
        }
    }
}

I want to get the output there are this number of methods in vehicle class,this number of methods in car class like wise.

like image 472
Randi Avatar asked Oct 11 '22 02:10

Randi


1 Answers

Parsing a Java source file with just regex is flaky at best. There are so many different ways to format or annotate the code that you'll easily miss valid method declarations. The regex in your code sample does not handle line breaks, generic methods, the throws clause, arbitrary return types, the synchronized modifier or annotated arguments, two method declarations on the same line...

You'd have to drop regex and build (or reuse) a full parser to be sure you get everything. Fortunately, if you have access to a JDK you can take a shortcut.

First, compile the Java source code. This will give you an output directory full of .class files (inner classes get their own file). Scan the output directory to collect all the class names you need to analyze.

Then, for each class, run the javap command, which will give you this kind of output:

barend@TURMINDER-XUSS /tmp$ javap java.util.Iterator
Compiled from "Iterator.java"
public interface java.util.Iterator{
    public abstract boolean hasNext();
    public abstract java.lang.Object next();
    public abstract void remove();
}

This is much easier to parse than a full Java source file. You can just count all lines containing \s[a-zA-Z][a-zA-Z0-9_]*\( and you have your method count. Use the 'compiled from' information to get to the method count per source file.

(edit) NOTE: javap doesn't print private methods by default. pass the -private argument to include these in the output.

like image 129
Barend Avatar answered Oct 14 '22 04:10

Barend