2012-02-03 5 views
0

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 루프에서

  1. 가 새 groovyclassloder 객체 만들기 및 groovy 스크립트를 두 번 파싱합니다. 루프가 두 번째 반복하고 groovyscript를 다시 구문 분석하려고하면 은 무엇이 발생합니까?
  2. 다른 개체가 만들어 질 때 두 번째로 발생할 것입니다. 클래스 로더가 클래스 패스에서 클래스를 가져 오거나 다시 클래스 파일을 다시 컴파일 할 수 있습니까?
  3. 재 컴파일이 트리거 될 때 Groovy는 소스가 인 것을 어떻게 알 수 있습니까?
+0

를 클래스를 다시 컴파일해야합니다 가서 소스 코드를 살펴 보지 않겠습니까? –

+0

@ tim_yates 안녕하세요, 시간이 내가 도울 수있는 날, 내가 소스 코드에 갔다 – anish

답변

0
  1. 당신은 클래스 로더를 버리고 새로운 하나를 만드는 루프 라운드마다. 이 새로운 classLoader는 버려진 classLoader에 의해로드 된 클래스에 대해 알지 못합니다.
  2. s 유형에 따라 다릅니다. 파일 인 경우 재 컴파일이 필요한지 여부를 확인하고 그렇지 않으면 동일한 클래스를 사용합니다. 그것은 String 또는 어떤 경우 모든 소스 코드이고, 그것은 당신이 didn를 다시 THEIS 문자열에서 내가 당신을 보여 때 당신의 마지막 질문 후 가정
  3. https://github.com/groovy/groovy-core/blob/master/src/main/groovy/lang/GroovyClassLoader.java#L845
+0

내가 이해가 안되는 이유는 두 번째 및 세 번째 시간에 대한 실행 시간이 너무 적습니다 (매번 루프는 당신이 멀리 클래스 로더를 던지고 있습니다 i == 0에 대한 첫 번째 구문 분석 시간) 실행에 대한 총 경과 시간 o 1570 두 번째 구문 분석 시간 실행시 경과 된 총 시간 o 33 = i == 1 처음 parseTotal 경과 시간 o 16 두 번째 구문 분석 시간 총 실행 경과 시간 o 16, – anish

+0

위의 코드에서 s는 무엇입니까? –

+0

코드 업데이트 – anish