Class.forName(classNameStr).getMethod(methodName).invoke(obj,Class)
比較兩個集合的運行結果差異。
package com.itcast.day1;import java.io.FileInputStream;import java.io.InputStream;import java.util.Collection;import java.util.HashSet;import java.util.Properties;import java.util.ArrayList;public class ReflectTest3 { public static void main(String[] args)throws Exception { InputStream ips = new FileInputStream("config.properties"); Properties props=new Properties(); props.load(ips);//1 硬盤加載到內存 ,2從內存中加載到props對象中 ips.close();//關閉是指釋放ips加載的資源,ips對象不會隨著close方法的執行而被JVM回收如果不關閉,則有小小的內存泄露 。 String className= props.getProperty("className"); System.out.println(className); Collection collections=(Collection)Class.forName(className).newInstance(); ReflectPoint pt1=new ReflectPoint(3,3); collections.add(pt1);//放入 }}
config.properties文件放在哪里呢?
相對當前工作路徑,在實際項目中,幾乎沒有這么干的!


實際項目一定要用絕對路徑,但絕對路徑不是硬編碼!
實際項目中應當:
config.properties文件在硬盤上的存放位置由用戶指定,用戶可配置“主目錄”/config.properties。
getRealPath();// 主目錄/config.properties
類加載器通常用來加載 *.class文件,既然 .class文件都可以加載進來(強大!),那么加載其他配置文件,豈不是小菜一碟!就看愿不愿意加載了。
RefectTest3.class.geteClassLoader().getResourceAsStream()//適用于只讀配置文件時
框架的配置文件都放在類路徑下,原因是框架內部讀取配置文件都是在采用類加載器加載方式,而類加載器加載文件時會從類路徑下查找。
package com.itcast.day1;import java.io.File;import java.io.InputStream;import java.net.URL;import java.util.Collection;import java.util.Properties;public class ReflectTest3 { public static void main(String[] args)throws Exception { //在類路徑下找文件,轉換成輸入流 InputStream ips=null;// ips=ReflectTest3.class.getClassLoader().getResourceAsStream// ("com"+File.separator+"itcast"+File.separator+"day1"+File.separator+"config.properties");// ips=ReflectTest3.class.getResourceAsStream("config.properties");//在本包下找 //Class提供了一種更簡潔的方式來加載配置文件(和class.newInstance方法省略了得到構造器類似),在類路徑的根目錄下開始找 ips=ReflectTest3.class.getResourceAsStream ("/"+"com"+File.separator+"itcast"+File.separator+"day1"+File.separator+"config.properties"); Properties props=new Properties(); props.load(ips);//1 硬盤加載到內存 ,2從內存中加載到props對象中 ips.close();//關閉是指釋放ips加載的資源,ips對象不會隨著close方法的執行而被JVM回收如果不關閉,則有小小的內存泄露 。 String className= props.getProperty("className"); System.out.println(className); Collection collections=(Collection)Class.forName(className).newInstance(); ReflectPoint pt1=new ReflectPoint(3,3); collections.add(pt1);//放入 System.out.println(collections.size()); }}新聞熱點
疑難解答