您好,登錄后才能下訂單哦!
這篇文章給大家分享的是Java使用屬性文件和Reflections動態加載類的方法。小編覺得挺實用的,因此分享給大家學習。如下資料是關于Reflections動態加載類的實現內容。
讓我們從一個非常簡單的問題陳述開始:指定特定鳥的名字后,我應該能夠加載它的字符。 例如:當我指定鴨子時,調用sound()函數應顯示“ quack”;
在這種情況下,你需要根據客戶端或外部源提供的某些數據動態加載類。 你還希望靈活地在簡單的屬性文件中配置類,并且這些類具有類似的行為。
為了實現這一點,我們將需要以下組件:
· mybirds.properties ——可在其中將鍵映射到類的屬性文件。
· MyBird.java ——屬性文件中指定的所有類都必須實現的接口。
· Duck.java, Eagle.java ——實現接口MyBird的類。
· MyBirdFactory.java ——動態創建類的工廠類
讓我們看一下這些代碼。讓我們從mybirds.properties開始。
1 2 3 | #BIRD-TYPE=IMPLEMENTATION-CLASS duck=com.foo.Duck eagle=com.foo.Eagle |
現在,MyBird.java接口聲明了子類應實現的方法。
1 2 3 4 5 6 7 8 | package com.foo;
/** * http://www.janeve.me */ public interface MyBird { public String sound(); } |
現在讓我們看看Duck.java和Eagle.java。
1 2 3 4 5 6 7 8 9 10 11 | package com.foo;
/** * http://www.janeve.me */ public class Duck implements MyBird {
public String sound() { return "Quack"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 | package com.foo;
/** * http://www.janeve.me */ public class Eagle implements MyBird {
public String sound() { return "Scream"; }
} |
MyBirdFactory.java是負責根據傳遞給它的birdType輸入創建所需實例的類。.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package com.foo;
import java.util.Enumeration; import java.util.Hashtable; import java.util.Locale; import java.util.ResourceBundle;
/** * http://www.janeve.me */ public class MyBirdFactory {
private static final String MY_BIRDS_CONFIGURATION = "mybirds"; private static Hashtable<String, String> myBirdsMappings = new Hashtable<String, String>();
static { try { loadMyBirdsrMappings(); } catch (Exception e) { e.printStackTrace(); } }
public static MyBird getMyBird(String birdType) { String className = myBirdsMappings.get(birdType);
MyBird bird = null;
try { if( className!=null) { Class cls = Class.forName(className); bird = (MyBird)cls.newInstance(); } } catch (Exception e) { e.printStackTrace(); }
return bird; }
private static void loadMyBirdsrMappings() { ResourceBundle rb = ResourceBundle.getBundle(MY_BIRDS_CONFIGURATION, Locale.getDefault()); for (Enumeration e = rb.getKeys(); e.hasMoreElements();) { String key = (String) e.nextElement(); myBirdsMappings.put(key, rb.getString(key)); } } } |
確保MY_BIRDS_CONFIGURATION的值與屬性文件的名稱相同。
我們可以編寫TestCode.java來測試代碼。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package com.foo;
/** * http://www.janeve.me */ public class TestCode {
public static void main(String[] args) { if(args.length <=0) System.out.println("Please provide input. E.G: duck eagle duck ..."); else { for(String name:args){ MyBird bird = MyBirdFactory.getMyBird( name ); if(bird == null){ System.out.println("Couldn't find your bird. Please make sure it's entered in mybirds.properties"); } else { System.out.println("The sound of the bird" + name + " is " + bird.sound() ); }
} }
}
} |
運行代碼時簽出輸出。
1 2 3 4 5 6 7 8 9 | C:\Janeve\MyBirds>java -classpath ./ com.foo.TestCode duck duck eagle duck eagle eagle The sound of the bird duck is Quack The sound of the bird duck is Quack The sound of the bird eagle is Scream The sound of the bird duck is Quack The sound of the bird eagle is Scream The sound of the bird eagle is Scream
C:\Janeve\MyBirds> |
如你所見,這些類是根據你的輸入加載的。
上文描述的就是Java使用屬性文件和Reflections動態加載類的方法,具體使用情況還需要大家自己動手實驗使用過才能領會。如果想了解更多相關內容,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。