1. 程式人生 > >Java基礎--反射機制簡單使用(Class類)

Java基礎--反射機制簡單使用(Class類)

//插槽類
public interface  InterfaceDemo {
	public void open();
	public void run();
	public void close();
}
//手機主機板類
public class CardSlotDemo {

	public void run() {
		System.out.println("主機板執行中。。。");
	}
	//呼叫卡槽介面
	public void interfaceMethod(InterfaceDemo ifd) {
		if(ifd != null ) {
			ifd.open();
			ifd.run();
			ifd.close();
		}
	}
}
//耳機類
public class HeadsetDemo implements InterfaceDemo{
	public void open() {
		System.out.println("耳機模式開啟中。。。");
	}
	public void run() {
		System.out.println("耳機模式執行中。。。");
	}
	public void close() {
		System.out.println("耳機模式退出中。。。");
	}

}
//記憶體卡類
public class MemoryDemo implements InterfaceDemo {
	public void open() {
		System.out.println("記憶體插入成功。。。");
	}
	public void run() {
		System.out.println("記憶體讀取中,請稍後。。。");
	}
	public void close() {
		System.out.println("記憶體讀取完畢。。。");
	}
}

/**
 * 利用反射機制動態載入類。
 *    JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。
 *    籠統來說就是動態載入類中屬性、方法、並且對相對應的類。來進行解剖。
 * 好處:不需要修改自己的程式碼。只需要配置自己的配置檔案即可。
 */
//主函式
public class PhoneDemo {

	public static void main(String[] args) throws Exception {
		//1.常規實現方式
		method_1();
		System.out.println("------使用反射機制-------");
		//2.使用反射機制來實現類的動態載入
		method_2();
	}
	
	private static void method_2() throws Exception {
		//獲取主機板類
		CardSlotDemo cd = new CardSlotDemo();
		cd.run();
		
		File fe = new File("phone.properties");
		//載入配置檔案
		FileInputStream fis = new FileInputStream(fe);
		//使用Properties集合,載入流中的配置檔案資訊
		Properties ps = new Properties();
		//載入流中配置檔案
		ps.load(fis);
		for (int i = 1;i<=ps.size();i++) {
			String cn = ps.getProperty("c"+i);
			if(cn == null) break;
			//獲取指定類中的類
			Class<?> cs = Class.forName(cn);
			//獲取物件
			Object obj = cs.newInstance();
			//使用主機板中是卡槽方法
			cd.interfaceMethod((InterfaceDemo)obj);
		}
	}

	private static void method_1() {
		//建立主機板類
		CardSlotDemo cd = new CardSlotDemo();
		cd.run();
		//插入主機板中的記憶體
		cd.interfaceMethod(new MemoryDemo());
	}
}
phone.properties檔案資訊如下:
c1=com.refiex.demo.HeadsetDemo
c2=com.refiex.demo.MemoryDemo

執行結果:
主機板執行中。。。
記憶體插入成功。。。
記憶體讀取中,請稍後。。。
記憶體讀取完畢。。。
------使用反射機制-------
主機板執行中。。。
耳機模式開啟中。。。
耳機模式執行中。。。
耳機模式退出中。。。
記憶體插入成功。。。
記憶體讀取中,請稍後。。。
記憶體讀取完畢。。。

API參考:

類 Class<T>

方法摘要
<U> Class<? extends U>
(Class<U> clazz) 
          強制轉換該 Class 物件,以表示指定的 class 物件所表示的類的一個子類。
 Tcast(Object obj) 
          將一個物件強制轉換成此 Class 物件所表示的類或介面。
 boolean 
          如果要在呼叫此方法時將要初始化該類,則返回將分配給該類的斷言狀態。
static Class<?> 
          返回與帶有給定字串名的類或介面相關聯的 Class 物件。
static Class<?> 
          使用給定的類載入器,返回與帶有給定字串名的類或介面相關聯的 Class 物件。
(Class<A> annotationClass) 
          如果存在該元素的指定型別的註釋,則返回這些註釋,否則返回 null。
 
          返回 Java Language Specification 中所定義的底層類的規範化名稱。
 Class<?>[] 
          返回一個包含某些 Class 物件的陣列,這些物件表示屬於此 Class 物件所表示的類的成員的所有公共類和介面。
 Class<?>
(Class<?>... parameterTypes) 
          返回一個 Constructor 物件,它反映此 Class 物件所表示的類的指定公共構造方法。
 
          返回一個包含某些 Constructor 物件的陣列,這些物件反映此 Class 物件所表示的類的所有公共構造方法。
 Class<?>[] 
          返回 Class 物件的一個數組,這些物件反映宣告為此 Class 物件所表示的類的成員的所有類和介面。
 
          返回一個 Constructor 物件,該物件反映此 Class 物件所表示的類或介面的指定構造方法。
 
          返回 Constructor 物件的一個數組,這些物件反映此 Class 物件表示的類宣告的所有構造方法。
 Field 
          返回一個 Field 物件,該物件反映此 Class 物件所表示的類或介面的指定已宣告欄位。
 Field[] 
          返回 Field 物件的一個數組,這些物件反映此 Class 物件所表示的類或介面所宣告的所有欄位。
 
          返回一個 Method 物件,該物件反映此 Class 物件所表示的類或介面的指定已宣告方法。
 
          返回 Method 物件的一個數組,這些物件反映此 Class 物件表示的類或介面宣告的所有方法,包括公共、保護、預設(包)訪問和私有方法,但不包括繼承的方法。
 Class<?> 
          如果此 Class 物件所表示的類或介面是另一個類的成員,則返回的 Class 物件表示該物件的宣告類。
 
          如果此 Class 物件表示某一方法中的一個本地或匿名類,則返回 Method 物件,它表示底層類的立即封閉方法。
 T[] 
          如果此 Class 物件不表示列舉型別,則返回列舉類的元素或 null。
 Field 
          返回一個 Field 物件,它反映此 Class 物件所表示的類或介面的指定公共成員欄位。
 Field[] 
          返回一個包含某些 Field 物件的陣列,這些物件反映此 Class 物件所表示的類或介面的所有可訪問公共欄位。
 Type[] 
          返回表示某些介面的 Type,這些介面由此物件所表示的類或介面直接實現。
 Type 
          返回表示此 Class 所表示的實體(類、介面、基本型別或 void)的直接超類的 Type
 Class<?>[] 
          確定此物件所表示的類或介面實現的介面。
(String name, Class<?>... parameterTypes) 
          返回一個 Method 物件,它反映此 Class 物件所表示的類或介面的指定公共成員方法。
 
          返回一個包含某些 Method 物件的陣列,這些物件反映此 Class 物件所表示的類或介面(包括那些由該類或介面宣告的以及從超類和超介面繼承的那些的類或介面)的公共 member 方法。
 int 
          返回此類或介面以整數編碼的 Java 語言修飾符。
 
          以 String 的形式返回此 Class 物件所表示的實體(類、介面、陣列類、基本型別或 void)名稱。
 Class<? super T> 
          返回表示此 Class 所表示的實體(類、介面、基本型別或 void)的超類的 Class
 
          按宣告順序返回 TypeVariable 物件的一個數組,這些物件表示用此 GenericDeclaration 物件所表示的常規宣告來宣告的型別變數。
 boolean 
          如果此 Class 物件表示一個註釋型別則返回 true。
 boolean 
          如果指定型別的註釋存在於此元素上,則返回 true,否則返回 false。
 boolean
 boolean 
          判定此 Class 物件是否表示一個數組類。
 boolean 
          判定此 Class 物件所表示的類或介面與指定的 Class 引數所表示的類或介面是否相同,或是否是其超類或超介面。
 boolean 
          當且僅當該類宣告為原始碼中的列舉時返回 true。
 boolean 
          判定指定的 Object 是否與此 Class 所表示的物件賦值相容。
 boolean 
          判定指定的 Class 物件是否表示一個介面型別。
 boolean 
          當且僅當底層類是本地類時返回 true
 boolean 
          當且僅當底層類是成員類時返回 true
 boolean 
          判定指定的 Class 物件是否表示一個基本型別。
 boolean 
          如果此類是複合類,則返回 true,否則 false
 T 
          建立此 Class 物件所表示的類的一個新例項。