2016-12-06 51 views
0

我爲使用Reflections.jar的第一次,所以我想知道以下有人可以幫助我知道org.reflections.Reflections罐子JDK版本的兼容性

  • 對此有任何版本的兼容性罐(如上面JDK6(或)高達jdk8)
  • 雖然加載類是有負載的任何命令(如罐子的字母順序(或)順序放置在類路徑)
+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項目,然後就發現他們出現在你的classpath像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 

在類執行Mainbin1/bin2/前路徑將找到並加載DummyClass1bin1/

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

輸出

class: sub.optimal.DummyClass1 
touched DummyClass 1 

在類路徑與bin2/執行Mainbin1/之前將找到並加載DummyClass1bin2/

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

輸出

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

謝謝,很明顯,我明白了:) ... – sera

+0

有什麼方法可以改變這種行爲。例如,我有罐子說'A.jar類Z.class,Y.class ....和B.jar - 類F.class,G.class ** ** Z.class依賴於F.class **我已經在classpath中設置了這些jar包含Z.jar; Y.jar; ,如果是這種情況,班級將如何加載?如果要加載第一個Y.class,然後加載G.class,有沒有辦法做到這一點? - 預先感謝:) – sera

+0

@sera如果'A.jar'(並且類路徑中沒有任何其他JAR文件)不包含'F.class',那麼'A.jar'和'B .jar'無所謂。如果'A.jar'和'B.jar'包含一個'F.class'並且你希望''''''''''''''''''''''''''''''''''''''''' '在班級路徑中。 – SubOptimal

0
+0

首先感謝回覆我。 – sera

+0

http://javarevisited.blogspot.ru/2012/07/when-class-loading-initialization-java-example.html在這位作者非常一般地解釋,所以我有疑問,**是否適合Refelections? ,是否有任何方法用於在Reflections中加載類?**提前致謝 – sera

+0

對不起,我誤解了你的第二個問題。至於Reflections如何加載類 - 我不知道,您可能會檢查他們的文檔或源代碼,因爲它是開源的。 – Sergi