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

person anish    schedule 03.02.2012    source источник
comment
Я предполагаю, что после вашего последнего вопроса, когда я показал вам, где находится исходный код всего этого, вы не пошли и не посмотрели на исходный код?   -  person tim_yates    schedule 03.02.2012
comment
@tim_yates привет, тим, можешь помочь мне с этим, я перешел к исходному коду   -  person anish    schedule 03.02.2012


Ответы (1)


  1. Каждый раз в цикле вы выбрасываете загрузчик классов и создаете новый. Этот новый classLoader не будет знать о классах, загруженных classLoader, который вы выбросили.
  2. Это зависит от типа s. Если это файл, он проверит, нуждается ли он в перекомпиляции, а если нет, то будет использовать тот же класс. Если это String или что-то в этом роде, то ему придется снова перекомпилировать класс из этой строки.
  3. https://github.com/groovy/groovy-core/blob/master/src/main/groovy/lang/GroovyClassLoader.java#L845
person tim_yates    schedule 03.02.2012
comment
чего я не понимаю, так это почему для второго и третьего времени время выполнения слишком меньше (каждый раз в цикле вы выбрасываете загрузчик классов и создаете новый) для i == 0 первое время синтаксического анализа Общее затраченное время выполнения o 1570 Second parse Time Общее затраченное время выполнения o 33 / for i==1 first parseTotal истекшее время выполнения o 16 Second parse Time Общее затраченное время выполнения o 16, - person anish; 04.02.2012