【问题标题】:GroovyClassloader behaviourGroovyClassloader 行为
【发布时间】:2012-02-03 14:16:10
【问题描述】:

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如何知道源是什么 改变了吗?

【问题讨论】:

  • 我假设在您最后一个问题之后,当我向您展示所有这些的源代码在哪里时,您没有去查看源代码?
  • @tim_yates 嗨,蒂姆你能帮我吗,我已经去源代码了

标签: groovy groovyclassloader


【解决方案1】:
  1. 每次循环时,您都会丢弃类加载器并创建一个新的类加载器。这个新的 classLoader 将不知道您丢弃的 classLoader 加载的类
  2. 这取决于s 的类型。如果它是一个文件,它将检查是否需要重新编译,如果不是,它将使用相同的类。如果是String 之类的,则必须再次从该字符串重新编译该类
  3. https://github.com/groovy/groovy-core/blob/master/src/main/groovy/lang/GroovyClassLoader.java#L845

【讨论】:

  • 我不明白的是为什么第二次和第三次执行时间太短(每次循环你都扔掉类加载器并创建一个新的)首先为 i==0 parse time 执行的总时间 o 1570 Second parse Time 执行的总时间 o 33 / for i==1 first parseTotal 执行的时间 o 16 Second parse Time 执行的总时间 o 16,
猜你喜欢
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
相关资源
最近更新 更多