通過反射類查看類的信息

  要反射一個類,必須先爲該類生成一個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對象,就可以獲取該類的真是信息,這種技術在開發上是非常有用的。

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