Groovy Метод isSyntheti c ложно для запуска и основного - PullRequest
0 голосов
/ 29 января 2020

Я анализирую сценарий groovy через Java, используя отражение, чтобы получить методы из сценария. Для моего проекта мне нужны все методы, которые не являются синтетическими c и publi c.

GroovyScriptEngine groovyScriptEngine = new GroovyScriptEngine(scriptFile.getAbsolutePath());
Class<GroovyObject> scriptClass = groovyScriptEngine.loadScriptByName(scriptFile.getName());

// some code

GroovyObject groovyObject = scriptClass.getConstructor().newInstance();
if (groovyObject != null) {
    Method[] declaredMethods = groovyObject.getClass().getDeclaredMethods();
    return Arrays.stream(declaredMethods)
          .filter(m -> !m.isSynthetic() && Modifier.isPublic(m.getModifiers()))
          .collect(Collectors.toList());
}

Для обычного groovy класса это возвращает все методы получения, установки и публикации c пользовательские методы.

Например:

class MyGroovyClass {
     def int number = 1

     int add(int anotherNumber) {
          return number + anotherNumber
     }
}

Анализ класса groovy возвращает getNumber, setNumber, addNumber. Для пустого groovy класса (без полей, без объявленных методов) это возвращает пустой список.

Но для пустого сценария (= полностью пустой файл) это возвращает методы "run "and" main ".

Почему получение и фильтрация (для не синтетических c и publi c) методов из пустого сценария groovy возвращают" run "и" main "? Как я могу отфильтровать эти два метода? (Или я могу поймать это дело раньше?)

1 Ответ

1 голос
/ 29 января 2020

Ну, groovy скрипт должен быть скомпилирован во что-то, что работает на JVM и имеет точку входа, по-видимому, это будет только класс с main методом.

Так что в основном groovy скрипт получает скомпилированный в класс, тело скрипта копируется в метод run, а метод main должен быть указан как точка входа, как я объяснил. В какой-то момент main вызовет run (косвенно).

Следовательно, для каждого скрипта вы получите эти методы.

Его описание в groovy документации (см. Параграф 3.2. Script class)

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