天天看点

通过反射类查看类的信息

  要反射一个类,必须先为该类生成一个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对象,就可以获取该类的真是信息,这种技术在开发上是非常有用的。