![](/img/trans.png)
[英]how to call a native method with user defined datatypes as its parameters from 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中的任何文件。 以下鏈接提供了足夠的信息來幫助您入門:
http://alvinalexander.com/blog/post/java/how-open-read-file-java-string-array-list
文件打開並讀入字符串后,您可以將包含調用的行解析為setOneMoreWorkingLineWithServiceID並讀取值。
讓我給你發一個簡單的編碼來實現你的目標:
請注意:
.java
文件以Demo.java
名稱Demo.java
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.