Поведение 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));
}
У меня есть пара вопросов относительно приведенного выше кода:
- В цикле for я создаю новый объект groovyclassloder и дважды разбираю скрипт groovy. Что произойдет, когда цикл повторяется во второй раз и снова пытается проанализировать groovy script?
- Что произойдет во второй раз, когда будет создан другой объект. Удастся ли загрузчику классов получить класс из classpath или снова перекомпилировать его?
- Когда происходит перекомпиляция, как Groovy узнает, что источник изменился?
1 ответ
- Каждый раз в цикле вы отбрасываете загрузчик классов и создаете новый. Этот новый classLoader не будет знать о классах, загруженных выброшенным вами classLoader
- Это зависит от типа
s
, Если это файл, он проверит, нуждается ли он в перекомпиляции, и если нет, он будет использовать тот же класс. Если этоString
или что-то, тогда ему придется снова перекомпилировать класс из этой строки - https://github.com/groovy/groovy-core/blob/master/src/main/groovy/lang/GroovyClassLoader.java#L845