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