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>

java.lang.Object
  |--java.lang.Class<T>
方法摘要
<U> Class<? extends U>
asSubclass(Class<U> clazz) 
          強制轉換該 Class 對象,以表示指定的 class 對象所表示的類的一個子類。
 Tcast(Object obj) 
          將一個對象強制轉換成此 Class 對象所表示的類或接口。
 booleandesiredAssertionStatus() 
          如果要在調用此方法時將要初始化該類,則返回將分配給該類的斷言狀態。
static Class<?>forName(String className) 
          返回與帶有給定字符串名的類或接口相關聯的 Class 對象。
static Class<?>forName(String name, boolean initialize, ClassLoader loader) 
          使用給定的類加載器,返回與帶有給定字符串名的類或接口相關聯的 Class 對象。
<A extends Annotation
A
getAnnotation(Class<A> annotationClass) 
          如果存在該元素的指定類型的註釋,則返回這些註釋,否則返回 null。
 Annotation[]getAnnotations() 
          返回此元素上存在的所有註釋。
 StringgetCanonicalName() 
          返回 Java Language Specification 中所定義的底層類的規範化名稱。
 Class<?>[]getClasses() 
          返回一個包含某些 Class 對象的數組,這些對象表示屬於此 Class 對象所表示的類的成員的所有公共類和接口。
 ClassLoadergetClassLoader() 
          返回該類的類加載器。
 Class<?>getComponentType() 
          返回表示數組組件類型的 Class
 Constructor<T>getConstructor(Class<?>... parameterTypes) 
          返回一個 Constructor 對象,它反映此 Class 對象所表示的類的指定公共構造方法。
 Constructor<?>[]getConstructors() 
          返回一個包含某些 Constructor 對象的數組,這些對象反映此 Class 對象所表示的類的所有公共構造方法。
 Annotation[]getDeclaredAnnotations() 
          返回直接存在於此元素上的所有註釋。
 Class<?>[]getDeclaredClasses() 
          返回 Class 對象的一個數組,這些對象反映聲明爲此 Class 對象所表示的類的成員的所有類和接口。
 Constructor<T>getDeclaredConstructor(Class<?>... parameterTypes) 
          返回一個 Constructor 對象,該對象反映此 Class 對象所表示的類或接口的指定構造方法。
 Constructor<?>[]getDeclaredConstructors() 
          返回 Constructor 對象的一個數組,這些對象反映此 Class 對象表示的類聲明的所有構造方法。
 FieldgetDeclaredField(String name) 
          返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段。
 Field[]getDeclaredFields() 
          返回 Field 對象的一個數組,這些對象反映此 Class 對象所表示的類或接口所聲明的所有字段。
 MethodgetDeclaredMethod(String name, Class<?>... parameterTypes) 
          返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。
 Method[]getDeclaredMethods() 
          返回 Method 對象的一個數組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。
 Class<?>getDeclaringClass() 
          如果此 Class 對象所表示的類或接口是另一個類的成員,則返回的 Class 對象表示該對象的聲明類。
 Class<?>getEnclosingClass() 
          返回底層類的立即封閉類。
 Constructor<?>getEnclosingConstructor() 
          如果該 Class 對象表示構造方法中的一個本地或匿名類,則返回 Constructor 對象,它表示底層類的立即封閉構造方法。
 MethodgetEnclosingMethod() 
          如果此 Class 對象表示某一方法中的一個本地或匿名類,則返回 Method 對象,它表示底層類的立即封閉方法。
 T[]getEnumConstants() 
          如果此 Class 對象不表示枚舉類型,則返回枚舉類的元素或 null。
 FieldgetField(String name) 
          返回一個 Field 對象,它反映此 Class 對象所表示的類或接口的指定公共成員字段。
 Field[]getFields() 
          返回一個包含某些 Field 對象的數組,這些對象反映此 Class 對象所表示的類或接口的所有可訪問公共字段。
 Type[]getGenericInterfaces() 
          返回表示某些接口的 Type,這些接口由此對象所表示的類或接口直接實現。
 TypegetGenericSuperclass() 
          返回表示此 Class 所表示的實體(類、接口、基本類型或 void)的直接超類的 Type
 Class<?>[]getInterfaces() 
          確定此對象所表示的類或接口實現的接口。
 MethodgetMethod(String name, Class<?>... parameterTypes) 
          返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法。
 Method[]getMethods() 
          返回一個包含某些 Method 對象的數組,這些對象反映此 Class 對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法。
 intgetModifiers() 
          返回此類或接口以整數編碼的 Java 語言修飾符。
 StringgetName() 
          以 String 的形式返回此 Class 對象所表示的實體(類、接口、數組類、基本類型或 void)名稱。
 PackagegetPackage() 
          獲取此類的包。
 ProtectionDomaingetProtectionDomain() 
          返回該類的 ProtectionDomain
 URLgetResource(String name) 
          查找帶有給定名稱的資源。
 InputStreamgetResourceAsStream(String name) 
          查找具有給定名稱的資源。
 Object[]getSigners() 
          獲取此類的標記。
 StringgetSimpleName() 
          返回源代碼中給出的底層類的簡稱。
 Class<? super T>getSuperclass() 
          返回表示此 Class 所表示的實體(類、接口、基本類型或 void)的超類的 Class
 TypeVariable<Class<T>>[]getTypeParameters() 
          按聲明順序返回 TypeVariable 對象的一個數組,這些對象表示用此 GenericDeclaration 對象所表示的常規聲明來聲明的類型變量。
 booleanisAnnotation() 
          如果此 Class 對象表示一個註釋類型則返回 true。
 booleanisAnnotationPresent(Class<? extends Annotation> annotationClass) 
          如果指定類型的註釋存在於此元素上,則返回 true,否則返回 false。
 booleanisAnonymousClass() 
          當且僅當底層類是匿名類時返回 true
 booleanisArray() 
          判定此 Class 對象是否表示一個數組類。
 booleanisAssignableFrom(Class<?> cls) 
          判定此 Class 對象所表示的類或接口與指定的 Class 參數所表示的類或接口是否相同,或是否是其超類或超接口。
 booleanisEnum() 
          當且僅當該類聲明爲源代碼中的枚舉時返回 true。
 booleanisInstance(Object obj) 
          判定指定的 Object 是否與此 Class 所表示的對象賦值兼容。
 booleanisInterface() 
          判定指定的 Class 對象是否表示一個接口類型。
 booleanisLocalClass() 
          當且僅當底層類是本地類時返回 true
 booleanisMemberClass() 
          當且僅當底層類是成員類時返回 true
 booleanisPrimitive() 
          判定指定的 Class 對象是否表示一個基本類型。
 booleanisSynthetic() 
          如果此類是複合類,則返回 true,否則 false
 TnewInstance() 
          創建此 Class 對象所表示的類的一個新實例。
 StringtoString() 
          將對象轉換爲字符串。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章