我需要解析某些方法调用调用,包括一些Java类的整个签名,例如
public class MyClass {
public void myMthod() {
// ... some code here
result = someInstance.someOtherMethod(param1, param2);
// ... some other code here
}
}
Run Code Online (Sandbox Code Playgroud)
结果我想得到类似的东西:
serviceName = someInstance
methodName = someOtherMethod
arguments = {
argument = java.lang.String,
argument = boolean
}
result = java.lang.Long
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最快方法是什么?我在考虑使用RegEx解析器.问题在于存在几种出现模式,例如
a)
result = someInstance.someOtherMethod(getSomething(), param);
b)
result =
getSomeInstance().someOtherMethod(param);
c)
result = getSomeInstance()
.someOtherMethod(
getSomethingElse(), null, param);
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激!谢谢!
不要使用正则表达式!使用了解java的工具.
使用:
在源解析器和ASM中,您将编写一个扫描方法调用的访问者.
对于javaparser:阅读此页面,扩展VoidVisitorAdapter并覆盖
public void visit(MethodCallExpr n, A arg)
Run Code Online (Sandbox Code Playgroud)
示例代码:
public static void main(final String[] args) throws Exception{
parseCompilationUnit(new File("src/main/java/foo/bar/Phleem.java"));
}
public static void parseCompilationUnit(final File sourceFile)
throws ParseException, IOException{
final CompilationUnit cu = JavaParser.parse(sourceFile);
cu.accept(new VoidVisitorAdapter<Void>(){
@Override
public void visit(final MethodCallExpr n, final Void arg){
System.out.println(n);
super.visit(n, arg);
}
}, null);
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是你只有对象名,而不是对象类型,因此你还必须保持一个本地的变量/字段Map来键入,这就是事情变得混乱的地方.毕竟,ASM可能是更容易的选择.
对于ASM:阅读本教程页面以开始使用
归档时间: |
|
查看次数: |
2989 次 |
最近记录: |