java 根据类名示例化类_如何使用示例从Java中的类路径加载资源
java 根據類名示例化類
Java中的類路徑不僅用于加載.class文件,而且還可以用于加載資源,例如屬性文件,圖像,圖標,縮略圖或任何二進制內容。 Java提供了API來將這些資源讀取為InputStream或URL。 假設您在項目的config文件夾中有一個屬性文件 ,并且想要加載該屬性文件,該怎么做? 同樣,您的項目的icons目錄中有Web應用程序的圖標和縮略圖,如何加載它們? 答案是通過使用java.lang.Class'getResource()和getResourceAsStream()方法。 這些方法接受資源的路徑為String并分別返回URL和InputStream。 您可以通過調用getClass()方法或使用類literal獲取類的引用。 如果有一個對象,則可以調用getClass(),因為它是一個非靜態方法,另一方面,如果沒有任何對象,則可以簡單地將.class與任何類的名稱一起使用,例如Sample.class將為您提供java.lang.Class的參考。 JDK 1.1提供了這些方法,您甚至可以在有權訪問核心Java庫的任何地方使用它們。 如果要創建J2ME游戲或應用程序,則可以使用這些方法為游戲加載圖標和圖塊,并為應用程序加載所有其他資源。
在內部,此方法將資源的加載請求委托給其類加載器。 如果對由BootStrap ClassLoader加載的對象調用getResourceAsStream()方法,則它將把它委托給ClassLoader.getSystemResourceAsStream(java.lang.String)方法。 我們將資源路徑傳遞給此方法,但是用于搜索與給定類關聯的資源的規則由該類的定義類加載器實現。 由于您可以將絕對路徑和相對路徑都傳遞給Class.getResourceAsStream(),但是ClassLoader.getResourceAsStream()采用絕對路徑,因此這就是使用以下算法從給定資源名稱構造絕對資源名稱的原因:
如果名稱以“ /”('\ u002f')開頭,則資源的絕對名稱是名稱中“ /”之后的部分。 否則,絕對名稱的格式如下:
modified_pa??ckage_name / name,其中modified_pa??ckage_name是此對象的軟件包名稱,用“ /”代替“。”。 ('\ u002e')。
這意味著,如果app.properties存儲在com.abc.config包中而不是當前類的包中,則傳遞給該方法的資源名稱應類似于/com/abc/config/app.properties。
如果您通過使用快捷鍵Ctrl + T并鍵入java.lang.Class來查看Eclipse IDE中java.lang.Class的代碼,則可以看到此方法的工作方式:
public InputStream getResourceAsStream(String name) {name = resolveName(name);ClassLoader cl = getClassLoader0();if (cl==null) {// A system class.return ClassLoader.getSystemResourceAsStream(name);}return cl.getResourceAsStream(name); }該算法是通過resolveName()方法實現的,如下所示:
/*** Add a package name prefix if the name is not absolute Remove leading "/"* if name is absolute*/private String resolveName(String name) {if (name == null) {return name;}if (!name.startsWith("/")) {Class c = this;while (c.isArray()) {c = c.getComponentType();}String baseName = c.getName();int index = baseName.lastIndexOf('.');if (index != -1) {name = baseName.substring(0, index).replace('.', '/')+"/"+name;}} else {name = name.substring(1);}return name;}
使用getResourceAsStream()方法加載資源時出現的主要問題是NullPointerException ,因為此方法如果找不到資源,則返回null。 在下面的示例中,我們有一個Eclipse項目,并且我在config目錄中創建了一個名為app.properties的屬性文件。 現在要加載該文件,我只需要傳遞“ app.properties”,如果傳遞諸如“ config / app.properties”或“ /config/app.properties”之類的信息,getResourceAsStream()將返回null,隨后代碼將拋出NullPointerException如下所示:
為了避免此錯誤,您必須在使用getResourceAsStream()之前檢查其輸出,由于這種方法,防御性編程就在那里。
這是我們完整的Java程序,可以從Java的classpath加載圖像,資源,文本文件或二進制文件,資源可以是任何東西,重要的是必須可訪問。
package test;import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Properties;/*** Java Program to demonstrate how to load resources e.g. properties file from* classpath. There are two ways to load resources in Java, one by using* getResourceAsStream() and getResource() method from java.lang.Class. Main* difference between these two methods are that one returns an InputStream* while other returns a URL object.** @author Javin Paul*/ public class ResourceLoader{public static void main(String args[]) {// loading resource using getResource() methodInputStream in = Test.class.getResourceAsStream("app.properties");Properties config = new Properties();try {config.load(in);System.out.println(config.getProperty("name"));System.out.println(config.getProperty("version"));} catch (IOException e1) {e1.printStackTrace();}// loading resource using getResourceAsStream() methodURL resourceURL = Test.class.getResource("app.properties");Properties appConfig = new Properties();try {appConfig.load(resourceURL.openStream());System.out.println(appConfig.getProperty("name"));System.out.println(appConfig.getProperty("version"));} catch (IOException e) {e.printStackTrace();}}}Output: SampleApp 1.0.0 SampleApp 1.0.0如果仔細觀察,您會發現我們同時使用了getResource()和getResourceAsStream()方法從Java中的類路徑加載資源,在這種情況下只是屬性文件。 第一個示例看上去比第二個示例更加簡潔,因為我們不需要打開顯式流,getResourceAsStream()方法將返回一個InputStream ,可以在任何地方使用它。 這就是如何從Java中的類路徑加載資源的全部內容。
翻譯自: https://www.javacodegeeks.com/2014/08/how-to-load-resources-from-classpath-in-java-with-example.html
java 根據類名示例化類
總結
以上是生活随笔為你收集整理的java 根据类名示例化类_如何使用示例从Java中的类路径加载资源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置linux密码例子(设置linux密
- 下一篇: javaserver_如何在JavaSe