В Java, как получить имя класса, атрибуты, метод из файла text / .java? - PullRequest
0 голосов
/ 28 ноября 2018

Мне нужно получить все имена классов и некоторую другую информацию в проекте Java.Прочитайте весь текст в файлах .java и используйте выражение Regex, чтобы получить:

  • class: name, модификатор, атрибуты, метод
  • атрибуты класса: name, modifier, type
  • метод: имя, модификатор, тип возвращаемого значения

Вот пример проекта:

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_\\$]*)", чтобы получить имя класса.Но получить другую информацию так сложно.Вы можете мне помочь ??

1 Ответ

0 голосов
/ 01 декабря 2018

Да, это намного сложнее.

Во-первых, вам нужно признать, что ваше регулярное выражение упрощает проблему.Посмотрите на фрагмент ниже:

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

Ваше выражение действительно найдет все классы.Но он не заметит отношения вложенности между test и smurf.Хуже того, он также найдет классы, которые не существуют, например, ложные срабатывания в комментариях.Наконец, ваше регулярное выражение не дает вам никаких наследственных отношений.

Теперь представьте, что вы можете определить большое выражение регулярного выражения для определения определений членов: как бы вы тогда делали разницу между членами test и членами smurf?Таким образом, ваша логика синтаксического анализа должна была бы отслеживать, в каком классе вы что анализируете.

Очень быстро у вас возникнут проблемы с синтаксическим анализом параметров метода и общих параметров, поскольку вам потребуется добавить в свой словарь синтаксического анализа новые типы, которые были определены где-то еще.

Итак, в конце концов, для решения вашей проблемы вам понадобится настоящий анализатор языка Java , такой же сложный, как и ваш компилятор.Или вы можете использовать существующих инструментов вместо того, чтобы изобретать свои собственные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...