在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
}
}