在Java中,如何从文本/.java文件中获取类名、属性和方法?

4

我需要获取一个Java项目中所有类的名称和一些其他信息。读取所有.java文件中的文本,并使用正则表达式获取:

  • 类:名称、修饰符、属性、方法
  • 类的属性:名称、修饰符、类型
  • 方法:名称、修饰符、返回类型

这里有一个项目示例:

public abstract class Shape {
    int numberOfSides;
    protected abstract double calculateArea();
    public final int getNumberOfSides() {
        return numberOfSides;
    }
}
public class Circle extends Shape{

    int radius;
    public Circle(int radius) {
        this.radius = radius;
    }

    @Override
    protected double calculateArea() {
        // TODO Auto-generated method stub
        return Math.PI*radius*radius;
    }
}
public class Square extends Shape{
    int sideLength;
    Square() {
        numberOfSides = 4;
    }
    public void setSideLengt(int sideL) {
        sideLength = sideL;
    }
    @Override
    protected double calculateArea() {
        // TODO Auto-generated method stub
        return this.sideLength*this.sideLength;
    }   
}

我使用了这个正则表达式: "class\\s*(?<className>[a-zA-Z][a-zA-Z\\d_\\$]*)" 来获取类名。 但是获取其他信息很困难。你能帮我吗?

你不满足于 .getClass() 吗? - Stultuske
2
不是答案,但如果没有已经可以为您完成此操作的API,我会吃掉这台笔记本电脑。 - Tim Biegeleisen
3
您可以使用类似于ANTLR的工具来基于语法解析文本。在该存储库中已经定义了一些Java语法。但可能有点过头了。如果您只是想要加载.java文件,那么您可以使用反射。 - Mark
1
尝试使用Enterprise Architect导入您的代码。或者自己编写一个Java编译器。 - qwerty_so
1
使用Java解析器 - 例如,可以查看我的开源项目SimpleGraph的Java模块http://wiki.bitplan.com/index.php/SimpleGraph-Java和测试用例https://github.com/BITPlan/com.bitplan.simplegraph/blob/master/simplegraph-java/src/test/java/com/bitplan/simplegraph/java/TestJavaSystem.java - Wolfgang Fahl
如果您有兴趣自己实现,可以查看https://en.m.wikipedia.org/wiki/Recursive_descent_parser。您可以很快为您寻找的简单语法编写一个解析器。也许可以结合SAX类型的监听器模式来捕获解析器发现的内容。 - muszeo
1个回答

1
Yes,这确实更加困难。
首先,您需要承认您的正则表达式过于简化了问题。请看下面的片段:
class test {
   /* class is important */ 
   class smurf {
   }
}
class test3 {
}

你的表达式确实可以找到所有类。但它不会注意testsmurf之间的嵌套关系。更糟糕的是,它还会找到不存在的类,比如评论中的误报。最后,你的正则表达式没有给出任何继承关系。

现在想象一下,你可以定义一个很好的正则表达式来检测成员定义:那么你怎样区分test的成员和smurf的成员呢?所以你的解析逻辑需要跟踪你正在解析什么类的内容。

很快,你将遇到解析方法参数和泛型参数的问题,因为你需要将其他地方定义的新类型添加到你的解析词汇表中。

因此,最终为了解决你的问题,你将需要一个真正的Java语言解析器,就像编译器中的解析器一样复杂。或者你可以使用现有的工具,而不是重新发明自己的工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接