Поведение GroovyClassloader

Понимание поведения 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 и дважды разбираю скрипт groovy. Что произойдет, когда цикл повторяется во второй раз и снова пытается проанализировать groovy script?
  2. Что произойдет во второй раз, когда будет создан другой объект. Удастся ли загрузчику классов получить класс из classpath или снова перекомпилировать его?
  3. Когда происходит перекомпиляция, как Groovy узнает, что источник изменился?

1 ответ

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