加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java方法调用解析器?

发布时间:2020-12-15 08:35:59 所属栏目:Java 来源:网络整理
导读:我需要解析某些方法调用调用,包括一些 Java类中的整个签名,例如: public class MyClass { public void myMthod() { // ... some code here result = someInstance.someOtherMethod(param1,param2); // ... some other code here }} 结果我想得到类似的东西
我需要解析某些方法调用调用,包括一些 Java类中的整个签名,例如:

public class MyClass {
    public void myMthod() {
        // ... some code here
        result = someInstance.someOtherMethod(param1,param2);
        // ... some other code here
    }
}

结果我想得到类似的东西:

serviceName = someInstance
methodName = someOtherMethod
arguments = {
   argument = java.lang.String,argument = boolean
}
result = java.lang.Long

实现这一目标的最快方法是什么?
我在考虑使用RegEx解析器.问题在于存在几种出现模式,例如

a)
result = someInstance.someOtherMethod(getSomething(),param);

b)
result = 
    getSomeInstance().someOtherMethod(param);

c)
result = getSomeInstance()
            .someOtherMethod(
                    getSomethingElse(),null,param);

任何帮助将非常感激!谢谢!

解决方法

不要使用正则表达式!使用了解java的工具.

使用:

>源代码解析器(例如javaparser)
>字节码分析(例如ASM)
>一个方面(AspectJ)

在源解析器和ASM中,您将编写一个扫描方法调用的访问者.

对于javaparser:阅读this page,延长VoidVisitorAdapter并覆盖

public void visit(MethodCallExpr n,A arg)

示例代码:

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

这里的问题是你只有对象名,而不是对象类型,因此你还必须保持一个本地的变量/字段Map来键入,这就是事情变得混乱的地方.毕竟,ASM可能是更容易的选择.

对于ASM:请阅读this tutorial page以开始使用

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读