我是第一次使用 Reflections.jar,所以我想知道以下内容
- 这个 jar 是否有任何版本兼容性(如上面的 jdk6(或)到 jdk8)
- 加载类时是否有任何加载顺序(如字母顺序(或)放置在类路径中的 jar 顺序)
我是第一次使用 Reflections.jar,所以我想知道以下内容
1)根据https://github.com/ronmamo/reflections/blob/master/pom.xml,它是用java 1.7编译的,所以兼容java版本>=1.7
2)http://javarevisited.blogspot .ru/2012/07/when-class-loading-initialization-java-example.html
如果您正在谈论这个https://github.com/ronmamo/reflections项目,那么它会按照类在类路径中出现的顺序查找类,就像 Java 启动器一样。此处描述了如何找到和加载类的方式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/DummyClass1.java
package sub.optimal;
public class DummyClass1 implements DummyInterface {
static {
System.out.println("touched DummyClass 2");
}
}
首先编译类,为了演示我们在不同的位置创建类文件
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
Main
在类路径中执行bin1/
beforebin2/
将找到并加载DummyClass1
inbin1/
java -cp bin/:bin1/:bin2/:lib/* Main
输出
class: sub.optimal.DummyClass1
touched DummyClass 1
Main
在类路径中执行bin2/
beforebin1/
将找到并加载DummyClass1
inbin2/
java -cp bin/:bin2/:bin1/:lib/* Main
输出
class: sub.optimal.DummyClass1
touched DummyClass 2