簡體   English   中英

如何從.java文件中定義的方法調用中讀取方法參數?

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

我想讀取傳遞給java類的特定方法的參數。 這是java文件:

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", "");

}
}

這里我想要提供給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", ""

我不知道用於從java代碼中讀取.java文件的API。 我的項目約束也是使用Java 5

你可以使用javaparser

Maven依賴

<dependency>
    <groupId>com.google.code.javaparser</groupId>
    <artifactId>javaparser</artifactId>
    <version>1.0.8</version>
</dependency>

分析器:

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.MethodCallExpr;
import japa.parser.ast.stmt.BlockStmt;
import japa.parser.ast.visitor.GenericVisitorAdapter;

import java.io.InputStream;
import java.util.List;

public class App {

    public static void main(String[] args) throws Exception {

        // creates an input stream for the file to be parsed
        InputStream in = App.class.getResourceAsStream("ABC.java");
        // if you want to use absolute path try this
        // InputStream in = FileInputStream("/path/to/file/ABC.java");


        CompilationUnit cu;
        try {
            // parse the file
            cu = JavaParser.parse(in);
        } finally {
            in.close();
        }

        // prints the resulting compilation unit to default system output
        visit(cu);
    }

    private static void visit(CompilationUnit cu) {
        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 ("doMessageDataOverrides".equals(method.getName())) {
                        BlockStmt body = method.getBody();
                        body.accept(new MyVisitor(), null);
                    }
                }
            }
        }
    }

    private static class MyVisitor extends GenericVisitorAdapter {
        public Object visit(MethodCallExpr n, Object arg) {
            if ("setOneMoreWorkingLineWithServiceID".equals(n.getName())){
                System.out.println(n.getArgs());
            }
            return super.visit(n, arg);
        }
    }

}

輸出:

---更新---

項目文件:

1)這是一個maven項目。 所以ABC.java文件應該在src / main / resources文件夾中。 如果你想使用絕對路徑,那么嘗試使用FileInputStream,如下所示。

InputStream in = FileInputStream("/path/to/file/ABC.java");

2)n.getArgs()是一個java.util.List。 你可以得到每個參數。 試試這個新的MyVisitor。

private static class MyVisitor extends GenericVisitorAdapter {
    public Object visit(MethodCallExpr n, Object arg) {
        if ("setOneMoreWorkingLineWithServiceID".equals(n.getName())){
            for (Expression expression : n.getArgs()) {
                System.out.println(expression.toString());
            }
        }
        return super.visit(n, arg);
    }
}

既然你說“我不知道用於從java代碼中讀取.java文件的API”,我將假設你在ABC.java中的方法傳遞給setOneMoreWorkingLineWithServiceID的值之后,而不是記錄傳遞給setOneMoreWorkingLineWithServiceID的所有值其他項目也是如此。

如果是這種情況,您可以使用標准方式讀取java中的任何文件。 以下鏈接提供了足夠的信息來幫助您入門:

Java:如何讀取文本文件

http://alvinalexander.com/blog/post/java/how-open-read-file-java-string-array-list

文件打開並讀入字符串后,您可以將包含調用的行解析為setOneMoreWorkingLineWithServiceID並讀取值。

讓我給你發一個簡單的編碼來實現你的目標:

請注意:

  • 我假設您的.java文件以Demo.java名稱Demo.java
  • 請注意,下面的編碼只是為了以簡單的方式實現SO的目標。
import java.io.*;

public class FileRead 
{

  public static int findString(String str, String findStr)
  {
    int lastIndex = 0;
    int count =0;

    while(lastIndex != -1)
    {
       lastIndex = str.indexOf(findStr,lastIndex);

       if( lastIndex != -1)
       {
         count ++;
         lastIndex+=findStr.length();
       }
    }
    return count;
  }

    public static void main(String args[]) throws IOException
    {
        BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
        System.out.print("Enter the name function to be searched for: ");
        String my_fun = in.readLine();

        FileReader fileReader = new FileReader(new File("Demo.java"));
        BufferedReader br = new BufferedReader(fileReader);

        String line = null;

        while ((line = br.readLine()) != null) 
        {
            if(findString(line, my_fun)>0)
            {
              int startIndex = line.indexOf("(");
              int endIndex = line.indexOf(")");
              String finalString = line.substring(startIndex+1,endIndex);
              System.out.println(finalString);
            }
        }
        in.close();
    }
    }

上面顯示的程序輸出如下:

C:\stackOverflowUser\myCode>javac FileRead.java C:\stackOverflowUser\myCode>java FileRead Enter the name function to be searched for: setOneMoreWorkingLineWithServiceID "01014013025", "25", "MPF", "N", "N", "A line in e2e", "", "NTE", "GOL", "", "Standard", "" "01014013026", "26", "MPF", "N", "N", "A line in e2e", "", "NTE", "GOL", "", "Standard", ""

謝謝bhdrk

我修改了你的代碼以滿足我的要求並且它有效。 謝謝 :)

這是文件:

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

}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM