2016-12-06 2 views
0

내가 처음 Reflections.jar을 사용하고 있습니다, 그래서누군가 나를

  • 다음 알고 싶다 이에 대한 모든 버전의 호환성이 있습니까 org.reflections.Reflections 항아리에 JDK 버전 호환성을 알고하는 데 도움이 될 수 있습니다 용기 (jdk8 개까지 상기 JDK6 (OR) 등) 클래스를로드하면서
  • https://github.com/ronmamo/reflections/blob/master/pom.xml 따르면
+0

클래스는 필요 기반에로드됩니다. 클래스가있는 방법에 대한 정보는 https : // docs에서 볼 수 있습니다.oracle.com/javase/8/docs/technotes/tools/findingclasses.html – SubOptimal

+0

응답 해 주셔서 감사합니다 ... https://docs.oracle.com/javase/8/docs/technotes/tools/findingclasses.html이 작성자 매우 일반적으로 설명했지만 내 의심은 ** Reflections **에 특정 종류의 클래스 로딩이 있습니까, 그렇다면 무엇입니까 – sera

답변

0

그런 다음 그들이 할 것 자바 실행과 같은 클래스 패스에 표시되는 순서에 따라 클래스를 찾을 수이 https://github.com/ronmamo/reflections 프로젝트에 대해 이야기합니다. 클래스를 찾고로드하는 방법은 여기 https://docs.oracle.com/javase/8/docs/technotes/tools/findingclasses.html에 설명되어 있습니다.

전체 클래스 이름과 일치하는 클래스 경로 순서의 첫 번째 클래스 파일이로드됩니다. 데모 용 작은 스 니펫을 찾으십시오.

다음 디렉토리와 파일

lib/annotations-2.0.1.jar 
lib/guava-15.0.jar 
lib/javassist-3.18.2-GA.jar 
lib/reflections-0.9.9.jar 
src/DummyInterface.java 
src/Main.java 
src1/DummyClass1.java 
src2/DummyClass1.java 

SRC/DummyInterface.java

package sub.optimal; 
public interface DummyInterface {} 

SRC/Main.java

import org.reflections.Reflections; 
import sub.optimal.DummyInterface; 
public class Main { 
    public static void main(String[] args) throws Exception { 
     Reflections reflections = new Reflections("sub.optimal"); 
     for (Class c : reflections.getSubTypesOf(DummyInterface.class)) { 
      System.out.println("class: " + c.getCanonicalName()); 
      c.newInstance(); 
     } 
    } 
} 

가정 SRC1/DummyClass1.java

package sub.optimal; 
public class DummyClass1 implements DummyInterface { 
    static { 
     System.out.println("touched DummyClass 1"); 
    } 
} 

SRC2/

package sub.optimal; 
public class DummyClass1 implements DummyInterface { 
    static { 
     System.out.println("touched DummyClass 2"); 
    } 
} 

DummyClass1.java 먼저 우리가 다른 위치에 클래스 파일을 생성 시연을위한 클래스를 컴파일

javac -cp lib/* -d bin/ src/DummyInterface.java src/Main.java 
javac -cp bin/:lib/* -d bin1/ src1/DummyClass1.java 
javac -cp bin/:lib/* -d bin2/ src2/DummyClass1.java 

bin1/을 사용하여 Main을 실행 한 후 bin2/ 클래스에 경로 발견 및로드 찾을 클래스 경로 bin1/ 전에 bin2/Main을 실행 DummyClass1

java -cp bin/:bin1/:bin2/:lib/* Main 

bin1/ 출력

class: sub.optimal.DummyClass1 
touched DummyClass 1 

를 상기 DummyClass1

java -cp bin/:bin2/:bin1/:lib/* Main 

bin2/ 출력을로드

class: sub.optimal.DummyClass1 
touched DummyClass 2 
+0

고마워요, 분명했고 ... :) – sera

+0

이 동작을 변경할 수있는 방법이 있습니다. 예를 들어 항아리에는'.jar class Z.class, Y.class ....와 B.jar-classes F.class, G.class'와 같은 A.jar이 있습니다. ** Z.class는 F.class에 따라 다릅니다 ** 나는 클래스 패스에있는이 항아리에 Z.jar, Y.jar; , 이것이 클래스가로드되는 경우라면? 먼저 Y.class를로드하고 G.class를로드하려면이 작업을 수행 할 수있는 방법이 있습니까? - 미리 감사드립니다 :) – sera

+0

@sera'.jar' (그리고 클래스 경로에있는 다른 JAR 파일이 없다면)는'F.class'를 포함하지 않습니다.'A.jar'와'B .jar'는 중요하지 않습니다. 'A.jar'와'B.jar'에'F.class'가 포함되어 있고'B.jar'에서'F.class'를로드하려면'B.jar'가'.jar '클래스 경로에서. – SubOptimal

0

1) (클래스 경로에 배치 된 용기의 순 (또는) 순서와 같은) 로딩 순서는이 존재 자바 1.7로 컴파일되므로 자바 버전과 호환된다. N> = 1.7
2) http://javarevisited.blogspot.ru/2012/07/when-class-loading-initialization-java-example.html

+0

우선 응답 해 주셔서 감사합니다. – sera

+0

http://javarevisited.blogspot.ru/2012/07/when-class-loading-initialization-java-example.html이 저자는 매우 일반적으로 설명 했으므로 의심 스럽지만 ** Reflection에도 적합합니까? Reflections에서 클래스를로드하는 데 사용되는 메소드가 있습니까? ** 미리 감사드립니다. – sera

+0

죄송합니다. 두 번째 질문에 대해 오해했습니다. Reflections가 클래스를로드하는 방법은 - 잘 모르겠지만 오픈 소스이므로 문서 나 소스 코드를 확인할 수 있습니다. – Sergi