GroovyClassloader行为

时间:2012-02-03 14:16:10

标签: groovy 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如何知道源代码是什么 改变?

1 个答案:

答案 0 :(得分:0)

  1. 每次循环你都会丢弃类加载器并创建一个新的。这个新的classLoader将不知道你抛弃的classLoader加载的类
  2. 这取决于s的类型。如果它是一个文件,它将检查是否需要重新编译,如果不是,它将使用相同的类。如果它是String或其他东西,那么它将不得不再次从theis String重新编译该类
  3. https://github.com/groovy/groovy-core/blob/master/src/main/groovy/lang/GroovyClassLoader.java#L845