내가 처음 Reflections.jar을 사용하고 있습니다, 그래서누군가 나를
- 다음 알고 싶다 이에 대한 모든 버전의 호환성이 있습니까 org.reflections.Reflections 항아리에 JDK 버전 호환성을 알고하는 데 도움이 될 수 있습니다 용기 (jdk8 개까지 상기 JDK6 (OR) 등) 클래스를로드하면서
- 는 https://github.com/ronmamo/reflections/blob/master/pom.xml 따르면
내가 처음 Reflections.jar을 사용하고 있습니다, 그래서누군가 나를
그런 다음 그들이 할 것 자바 실행과 같은 클래스 패스에 표시되는 순서에 따라 클래스를 찾을 수이 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
고마워요, 분명했고 ... :) – sera
이 동작을 변경할 수있는 방법이 있습니다. 예를 들어 항아리에는'.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
@sera'.jar' (그리고 클래스 경로에있는 다른 JAR 파일이 없다면)는'F.class'를 포함하지 않습니다.'A.jar'와'B .jar'는 중요하지 않습니다. 'A.jar'와'B.jar'에'F.class'가 포함되어 있고'B.jar'에서'F.class'를로드하려면'B.jar'가'.jar '클래스 경로에서. – SubOptimal
1) (클래스 경로에 배치 된 용기의 순 (또는) 순서와 같은) 로딩 순서는이 존재 자바 1.7로 컴파일되므로 자바 버전과 호환된다. N> = 1.7
2) http://javarevisited.blogspot.ru/2012/07/when-class-loading-initialization-java-example.html
우선 응답 해 주셔서 감사합니다. – sera
http://javarevisited.blogspot.ru/2012/07/when-class-loading-initialization-java-example.html이 저자는 매우 일반적으로 설명 했으므로 의심 스럽지만 ** Reflection에도 적합합니까? Reflections에서 클래스를로드하는 데 사용되는 메소드가 있습니까? ** 미리 감사드립니다. – sera
죄송합니다. 두 번째 질문에 대해 오해했습니다. Reflections가 클래스를로드하는 방법은 - 잘 모르겠지만 오픈 소스이므로 문서 나 소스 코드를 확인할 수 있습니다. – Sergi
클래스는 필요 기반에로드됩니다. 클래스가있는 방법에 대한 정보는 https : // docs에서 볼 수 있습니다.oracle.com/javase/8/docs/technotes/tools/findingclasses.html – SubOptimal
응답 해 주셔서 감사합니다 ... https://docs.oracle.com/javase/8/docs/technotes/tools/findingclasses.html이 작성자 매우 일반적으로 설명했지만 내 의심은 ** Reflections **에 특정 종류의 클래스 로딩이 있습니까, 그렇다면 무엇입니까 – sera