一个类的成员包括:
- 变量
- 构造器
- 方法
在反射中,变量用Field对象表示,构造器用Constructor对象表示,方法则用Method表示。
Class中相关方法:
getConstructors();返回该类型的Class的所有构造器方法对象
getDeclaredFields();返回该类型Class的所有字段对象(包括私有的,不包括继承的)
getDeclaredMethods();返回该类型Class的所有方法对象(包括私有的,不包括继承的)
getFields();返回该类型Class的所有公共字段对象(包括超类的)
getMethoods();返回该类型Class的所有公共方法对象(包括超类的)
实例学习
首先编写测试用的Bean:
package ReflectStudy.Exa4;
import EnumStudy.Test;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.AbstractList;
/**
* 我是测试的Bean
*/
@Resource
public class TestBean<T> extends AbstractList<T> implements Serializable {
public String name;
public String code;
private String password;
public TestBean(){
}
public TestBean(String code){
this.code = code;
}
@Override
public int size() {
return 0;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean contains(Object o) {
return false;
}
@Override
public T get(int index) {
return null;
}
}
然后编写程序:
package ReflectStudy.Exa4;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 查看类的成员:
* 1.属性字段信息
* 2.方法信息
* 3.构造方法信息
*/
public class ClassViewer {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> clazz = Class.forName("ReflectStudy.Exa4.TestBean");
System.out.println("类的规范名称:" + clazz.getCanonicalName());
// 获得该类对象的所有构造方法对象
Constructor<?>[] constructors = clazz.getConstructors();
System.out.println("类TestBean的构造方法:");
if (constructors.length != 0) {
for (Constructor<?> constructor : constructors) {
System.out.println("\t" + constructor);// 输出构造方法
}
} else {
System.out.println("\t空");
}
// 获得该类对象的所有非继承字段对象数组
Field[] fields = clazz.getDeclaredFields();
System.out.println("类的非继承变量(包括私有的):");
if (fields.length != 0) {
for (Field field : fields) {
System.out.println("\t" + field);// 输出非继承域
}
} else {
System.out.println("\t空");
}
// 获得该类对象的所有非继承方法对象数组
Method[] methods = clazz.getDeclaredMethods();
System.out.println("类的非继承方法(包括私有的):");
if (methods.length != 0) {
for (Method method : methods) {
System.out.println(method);// 输出非继承方法
}
} else {
System.out.println("\t空");
}
//获得类的公共字段对象数组
Field[] pubFields = clazz.getFields();
System.out.println("类的所有公共字段(包括继承的):");
for (Field field : pubFields) {
System.out.println("\t" + field);
}
//获得类的公共方法对象数组
Method[] pubMethods = clazz.getMethods();
System.out.println("类的所有公共方法(包括继承的):");
for (Method method : pubMethods) {
System.out.println(method);
}
}
}
运行之,测试结果: