Search code examples
javafilefile-ioread-write

How to read method parameters from a method call defined in a .java file?


I want to read parameters passed to a particular method of a java class. Here is the java file:

package config;

public class ABC extends LineAvailabilityNew
{

public ABC(Message msg)
    throws MessageHandlerExcection
{
    super(msg);
}

public void doMessageDataOverrides()
    throws MessageHandlerExcection
{
    super.doMessageDataOverrides();
    setWorkingLineQty("21");
    setStoppedLineQty("10");
    setworkingLineExchangeGroupCode("GOL");
    setWorkingLineWithServiceID("01014013024", "24", "MPF", "N", "N", "A line in e2e", "", "NTE", "GOL", "", "Standard", "");
    setOneMoreWorkingLineWithServiceID("01014013025", "25", "MPF", "N", "N", "A line in e2e", "", "NTE", "GOL", "", "Standard", "");
    setOneMoreWorkingLineWithServiceID("01014013026", "26", "MPF", "N", "N", "A line in e2e", "", "NTE", "GOL", "", "Standard", "");
    setOneMoreStoppedLineWithServiceID("01014013015", "15", "PSTN Single Line", "N", "N", "", "NTE", "GOL", "", "Standard", "");

}
}

Here I want parameter values supplied to setWorkingLineWithServiceID();

 So my output should be something like this:
 1> "01014013024", "24", "MPF", "N", "N", "A line in e2e", "", "NTE", "GOL", "", "Standard", ""
 2> "01014013026", "26", "MPF", "N", "N", "A line in e2e", "", "NTE", "GOL", "", "Standard", ""

I am not aware of APIs used for reading .java files from java code. Also my project constraint is to use Java 5


Solution

  • Thanks bhdrk

    I modified your code a bit to suit my requirement and it worked. Thanks :)

    Here's the file:

    package test;
    
    import japa.parser.JavaParser;
    import japa.parser.ast.CompilationUnit;
    import japa.parser.ast.body.BodyDeclaration;
    import japa.parser.ast.body.MethodDeclaration;
    import japa.parser.ast.body.TypeDeclaration;
    import japa.parser.ast.expr.Expression;
    import japa.parser.ast.expr.MethodCallExpr;
    import japa.parser.ast.stmt.BlockStmt;
    import japa.parser.ast.visitor.GenericVisitorAdapter;
    
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    public class JavaFileParser {
    
    static String strFilePath = null;
    static String strMainMethod = null;
    static String strMethodName = null; 
    
    private static void dataSetter(String pFilePath, String pMainMethod, String pMethodName) {
        strFilePath = pFilePath;
        strMainMethod = pMainMethod;
        strMethodName = pMethodName;
    }
    
    public static ArrayList getMethodParameters(String pFilePath, String pMainMethod, String pMethodName) throws Exception {
    
    
        // creates an input stream for the file to be parsed
        ArrayList args1 =  null;
    
        dataSetter(pFilePath,pMainMethod, pMethodName);
        InputStream in = new FileInputStream(strFilePath);
    
        CompilationUnit cu;
        try {
            // parse the file
            cu = JavaParser.parse(in);
        } finally {
            in.close();
        }
    
        // prints the resulting compilation unit to default system output
        args1 =  visit(cu);     
    
        return args1;
    }
    
    private static ArrayList visit(CompilationUnit cu) {
        ArrayList  paramatersList = null;
        List<TypeDeclaration> types = cu.getTypes();
        for (TypeDeclaration type : types) {
            List<BodyDeclaration> members = type.getMembers();
            for (BodyDeclaration member : members) {
                if (member instanceof MethodDeclaration) {
                    MethodDeclaration method = (MethodDeclaration) member;
                    if (strMainMethod.equals(method.getName())) {
                        BlockStmt body = method.getBody();
                        MyVisitor myVisitor = new MyVisitor();
                        body.accept(myVisitor, null);
                        paramatersList = myVisitor.getParamatersList();
                    }
                }
            }
        }
    
        return paramatersList;
    }
    
    private static class MyVisitor extends GenericVisitorAdapter {
    
        private ArrayList paramatersList= new ArrayList();
    
        public Object visit(MethodCallExpr n, Object arg) {
    
            if (strMethodName.equals(n.getName())){
                    List<Expression> expressionList = n.getArgs();
                    paramatersList.add(expressionList) ;
            }
    
            return super.visit(n, arg);
        }
    
        public ArrayList getParamatersList() {
            return paramatersList;
        }
    
    }
    
    }