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脚本 . 当循环第二次迭代,并尝试再次解析groovyscript时,会发生什么?
-
第二次创建另一个对象时会发生什么 . 类加载器是否会设法从类路径中获取类或再次重新编译它?
-
当触发重新编译时,groovy如何知道源的更改?
1 回答
每次循环你都会丢弃类加载器并创建一个新的加载器 . 这个新的classLoader将不知道你抛弃的classLoader加载的类
这取决于
s
的类型 . 如果它是一个文件,它将检查是否需要重新编译,如果不是,它将使用相同的类 . 如果它是String
或其他东西,那么它将不得不再次从theis String重新编译该类https://github.com/groovy/groovy-core/blob/master/src/main/groovy/lang/GroovyClassLoader.java#L845