我第一次使用Reflections.jar,所以我想知道以下几点
发布于 2016-12-07 07:57:44
如果您正在谈论这个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.javasrc/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/执行bin2/将在bin1/中查找和加载DummyClass1
java -cp bin/:bin1/:bin2/:lib/* Main输出
class: sub.optimal.DummyClass1
touched DummyClass 1在类路径中的Main之前使用bin2/执行bin1/将在bin2/中查找和加载DummyClass1
java -cp bin/:bin2/:bin1/:lib/* Main输出
class: sub.optimal.DummyClass1
touched DummyClass 2发布于 2016-12-06 07:25:50
1)根据https://github.com/ronmamo/reflections/blob/master/pom.xml,它是用Java1.7编译的,因此它与java版本的>=1.7兼容
2) http://javarevisited.blogspot.ru/2012/07/when-class-loading-initialization-java-example.html
https://stackoverflow.com/questions/40989328
复制相似问题