0

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 スクリプトを 2 回解析しています。ループが 2 度目に繰り返され、groovyscript を再度解析しようとすると、どうなりますか?
  2. 別のオブジェクトが作成されたときに 2 回目に何が起こるか。クラスローダは、クラスパスからクラスを取得するか、再度再コンパイルしますか?
  3. 再コンパイルがトリガーされると、groovy はソースが変更されたことをどのように認識しますか?
4

1 に答える 1

0
  1. ループを回るたびに、クラスローダーを破棄して新しいクラスローダーを作成しています。この新しい classLoader は、破棄した classLoader によってロードされたクラスを認識しません。
  2. の種類によって異なりますs。ファイルの場合、再コンパイルが必要かどうかをチェックし、そうでない場合は同じクラスを使用します。または何かである場合は、Stringその文字列から再度クラスを再コンパイルする必要があります。
  3. https://github.com/groovy/groovy-core/blob/master/src/main/groovy/lang/GroovyClassLoader.java#L845
于 2012-02-03T14:40:36.860 に答える