Поведение GroovyClassloader - PullRequest
       69

Поведение GroovyClassloader

0 голосов
/ 03 февраля 2012

GroovyClassloader понимание поведения,

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");
GroovyScriptEngineImpl groovyEngineImpl = (GroovyScriptEngineImpl) engine;

в цикле,

for (int i = 0; i < 10; i++) {
            long startTime = System.currentTimeMillis();
            classLoader = new GroovyClassLoader(groovyEngineImpl.getClassLoader().getParent());
            fileName = fileName + i;
            Class groovyClass = classLoader.parseClass(s,fileName);
            long endTime = System.currentTimeMillis();
            System.out.println("Total elapsed time in execution o  " + (endTime-startTime));
            startTime = System.currentTimeMillis();
            groovyClass = classLoader.parseClass(s,fileName);
            endTime = System.currentTimeMillis();
            System.out.println("Second Time Total elapsed time in execution o  " + (endTime-startTime));


}

У меня есть пара вопросов относительно кода выше:

  1. В цикле for я создаю новый объект groovyclassloder и парсинг скриптов в два раза. Когда цикл повторяется для второй раз, и снова пытается разобрать groovyscript, что будет происходят?
  2. Что произойдет во второй раз, когда будет создан другой объект. Удастся ли загрузчику классов получить класс из classpath или снова перекомпилировать снова?
  3. Когда запускается перекомпиляция, как Groovy узнает, что это за источник? изменилось?

1 Ответ

0 голосов
/ 03 февраля 2012
  1. Каждый раз во время цикла вы отбрасываете загрузчик классов и создаете новый.Этот новый classLoader не будет знать о классах, загруженных выброшенным вами classLoader
  2. Это зависит от типа s.Если это файл, он проверит, нуждается ли он в перекомпиляции, и если нет, он будет использовать тот же класс.Если это String или что-то еще, то ему придется заново скомпилировать класс из этой строки
  3. https://github.com/groovy/groovy-core/blob/master/src/main/groovy/lang/GroovyClassLoader.java#L845
...