Java反射學習總結(1)——Class類的使用

在Java中,每個class都有一個相應的Class對象。也就是說,當我們編寫一個類,編譯完成後,在生成的.class文件中,就會產生一個Class對象(Class類不能人爲創建由JVM自動調用),用於表示這個類的類型信息。所以說:類也是對象,並且它是java.lang.Class類的實例對象。獲取Class實例對象主要有三種方式:

package reflectTest;
public class ClassDemo {
	public static void main(String[] args) {
		//Foo的實例對象如何表示,可以通過如下我們熟知的方式
		Foo foo1 = new Foo();
		//但是Foo這個類其實也是一個實例對象,它是Class類的實例對象
		//其實任何一個類都是Class的實例對象,這個實例對象我們稱爲對應類的類類型(class tyoe)
		//實例對象有三種表示方式
		//第一種表示方式:實際在告訴我們任何一個類都有一個隱含的靜態成員變量class
		Class c1 = Foo.class;
		//第二種表示方式 : 已經知道該類的對象通過getClass方法
		Class c2 = foo1.getClass();
		//第三種表示方式:可以用來實現類的動態加載
		Class c3 = null;
		try {
			c3 = Class.forName("reflectTest.Foo");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//不管c1,c2,c3都代表了Foo類的類類型,一個類只可能是Class類的一個實例對象
		System.out.println(c1 == c2); //輸入true
		System.out.println(c2 == c3); //輸出true
		//可以通過類的類類型創建該類的對象實例---->通過c1 or c2 or c3創建Foo的實例對象
		try {
			Foo foo = (Foo)c1.newInstance();//需要有無參數的構造方法
			foo.print(); //輸出foo
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

class Foo{
	void print(){
		System.out.println("foo");
	}
}
其實不止類有類類型,基本數據類型和像void這些關鍵字也有類類型:

package reflectTest;

public class ClassDemo2 {
	
	public static void main(String[] args) {
		
		Class c1 = int.class;//int 的類類型
		Class c2 = String.class;//String類的類類型
		Class c3 = double.class;
		Class c4 = Double.class;
		Class c5 = void.class; //void的類類型
		
		System.out.println(c1.getName()); //輸出int
		System.out.println(c2.getName()); //輸出java.lang.String
		System.out.println(c2.getSimpleName());//不包含包名的類的名稱,輸出String
		System.out.println(c5.getName());// 輸出void
	}

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