要反射一個類,必須先爲該類生成一個Class的對象,以下介紹生成Class對象的三種方法:
1.使用Class對象的forName(String name)方法,裏面的String類型參數是你要反射的類的全限定類名,例如這樣的格式:com.xujianguo.model.Admin。
2.直接使用該類的class屬性,即例如Admin.class,則會返回一個Class的對象。
3.如果你擁有該類的對象,則可以通過對象的getClass()方法返回一個Class對象,這樣也是挺方便的。
現在我先定義一個類,類的信息如下:
public class Admin {
private int id;
private String name;
private double account;
private static double version = 2.9;
public Admin() {
}
public Admin(int id , String name , double account){
this.id = id;
this.name = name;
this.account = account;
}
public static double getVersion() {
return version;
}
public static void setVersion(double version) {
Admin.version = version;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getAccount() {
return account;
}
public void setAccount(double account) {
this.account = account;
}
public String toString() {
return id + " = " + name + " = " + account;
}
}
現在我們嘗試反射該類的信息:
首先我們要獲取類的對象:
private static Class<Admin> clazz;
@BeforeClass
public static void init() {
clazz = Admin.class;
}
通過查API文檔,我們可以發現有個getConstructors()的方法,可以獲取類的全部構造方法,現在我們就調用它:
@Test
public void getConstructor() {
Constructor[] constructor = clazz.getDeclaredConstructors();
for(Constructor c : constructor) {
System.out.println(c);
}
}
打印出現的信息如下:
public com.xujianguo.model.Admin()
public com.xujianguo.model.Admin(int,java.lang.String,double)
可以看出我們類的構造器的信息都知道了,無論是修飾符還是參數的類型都知道了。
用面向對象的思維我們可以猜出一個有一個getDeclaredMethods()方法來獲取類方法的信息,事實也是如此,調用它:
@Test
public void getMethod() {
Method[] method = clazz.getDeclaredMethods();
for(Method m : method) {
System.out.println(m);
}
}
打印出現的信息如下:
public java.lang.String com.xujianguo.model.Admin.toString()
public java.lang.String com.xujianguo.model.Admin.getName()
public int com.xujianguo.model.Admin.getId()
public void com.xujianguo.model.Admin.setName(java.lang.String)
public static double com.xujianguo.model.Admin.getVersion()
public static void com.xujianguo.model.Admin.setVersion(double)
public void com.xujianguo.model.Admin.setId(int)
public double com.xujianguo.model.Admin.getAccount()
public void com.xujianguo.model.Admin.setAccount(double)
下面我們當然要獲取成員變量的值了,調用的是getDeclaredFields()方法:
@Test
public void getField() {
Field[] field = clazz.getDeclaredFields();
for(Field f : field) {
System.out.println(f);
}
}
打印出現的信息如下:
private int com.xujianguo.model.Admin.id
private java.lang.String com.xujianguo.model.Admin.name
private double com.xujianguo.model.Admin.account
private static double com.xujianguo.model.Admin.version
可以看出反射出了全部的信息,毫不保留啊,厲害!
有人看到這裏就說夠了,但是我們不僅可以反射出它的構造方法、方法、成員變量,還可以獲取它的包名和父類:
@Test
public void getOtherMessage() {
System.out.println(clazz.getPackage());
System.out.println(clazz.getSuperclass());
}
打印出現的信息如下:
package com.xujianguo.model
class java.lang.Object
反射就可以獲取一個類的全部信息,通過傳進來的Class對象,就可以獲取該類的真是信息,這種技術在開發上是非常有用的。