【问题标题】:In Java, how to get class name, attributes, method from text/.java file?在 Java 中,如何从 text/.java 文件中获取类名、属性、方法?
【发布时间】:2019-04-30 06:19:27
【问题描述】:

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

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

这里是一个项目示例:

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() 对你来说还不够吗?
  • 不是答案,但如果还没有可以为您执行此操作的 API,我会吃掉这台笔记本电脑。
  • 您可以使用类似ANTLR 的东西,它可以基于grammars 解析文本,在该存储库上已经定义了一些Java 语法。不过可能有点矫枉过正。如果您可以只加载 .java 文件,则可以使用反射。
  • 尝试 Enterprise Architect 导入您的代码。或者自己写一个Java编译器。
  • 使用 Java 解析器 - 作为示例,请参阅我的开源项目 SimpleGraph wiki.bitplan.com/index.php/SimpleGraph-Java 的 Java 模块和测试用例 github.com/BITPlan/com.bitplan.simplegraph/blob/master/…

标签: java regex class expression uml


【解决方案1】:

是的,这要困难得多。

首先,您需要知道您的正则表达式过度简化了问题。看下面的sn-p:

class test {
   /* class is important */ 
   class smurf {
   }
}
class test3 {
}

您的expression 确实会找到所有课程。但它不会注意到testsmurf 之间的嵌套关系。更糟糕的是,它还会找到不存在的类,例如 cmets 中的误报。最后,您的正则表达式不会给您任何继承关系。

现在想象一下,您可以定义一个出色的正则表达式来检测成员定义:那么您将如何区分 test 的成员和 smurf 的成员?所以你的解析逻辑需要跟踪你在哪个类中解析什么。

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

所以最后,要解决您的问题,您将需要一个真正的java language parser,与您的编译器中的一样复杂。或者您可以使用existing tools 而不是重新发明自己的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多