1、在运行时能够获取任意类型的详细信息
后期的时候,在框架中,例如:spring框架,会帮我们管理很多的类,
而这些类不是spring写的,而是我们写的,然后在运行期间spring取加载获取的。
步骤:
- (1)获取这个类的Class对象
- (2)获取类的信息
- ①包名
- ②类名
- ③类的修饰符
- Modifier
- ④直接父类
- ⑤父接口们
- ⑥属性们
- ⑦构造器们
- ⑧方法们
一切皆对象:
- (1)所有类型在内存中都是Class对象
- (2)所有的属性都是Field对象
private int age;
属性类型:Field类型
类的概念:一类具有相同特性的事物的抽象描述。
所有的属性,有没有相同特征:
都是有修饰符、数据类型、名称
都有相同的行为操作:get获取值/set设置值
所以把属性抽象为Field类,那么一个属性被加载到内存后,是用一个Field对象表示的。
- (3)所有的构造器都是Constructor的对象
所有的构造器都有:
修饰符,名称,形参列表
都能 new 对象
所以把构造器抽象为Constructor类,那么一个构造器被加载到内存后,是用一个Constructor对象表示的。 - (4)所有的方法都是Method对象
所有的方法都有:
修饰符、返回值类型、方法名、形参列表、抛出的异常列表
都能 被调用invoke
public class TestClassInfo {
private Class clazz;
@Before
public void test01()throws Exception{
//如果这个类名是在配置文件中,先获取类名
Properties pro = new Properties();
pro.load(TestClassInfo.class.getClassLoader().getResourceAsStream("bean.properties"));
String className = pro.getProperty("className");//key就是bean.properties文件中=左边的属性名
//(1)获取这个类的Class对象
clazz = Class.forName(className);
System.out.println(clazz);
}
@Test
public void test02(){
//(2)获取类的详细信息
//clazz代表com.atguigu.ext.demo.AtGuiguDemo这个类
//获取包名
Package pkg = clazz.getPackage();
System.out.println("包名:" + pkg.getName());
//获取类名
System.out.println("类名:" + clazz.getName());
//类的修饰符
int mod = clazz.getModifiers();
System.out.println("修饰符的值:" + mod);
System.out.println("修饰符:" + Modifier.toString(mod));
Class sc = clazz.getSuperclass();
System.out.println("父类的名称:" + sc.getName());
Class[] interfaces = clazz.getInterfaces();
System.out.println("父接口们:");
for (Class inter : interfaces) {
System.out.println(inter.getName());
}
//每一个属性就是一个Field的对象
/*
* (1)Field[] getFields() 得到所有公共的属性
* (2)Field[] getDeclaredFields() 得到所有声明的属性
*/
Field[] fields = clazz.getDeclaredFields();
int count = 0;
for (Field field : fields) {
count++;
int fMod = field.getModifiers();
System.out.println(count + ":属性的修饰符:" + Modifier.toString(fMod));
System.out.println(count + ":属性的数据类型:" + field.getType().getName());
System.out.println(count + ":属性的名称:" + field.getName());
}
/*
* Constructor[] getConstructors():得到所有的公共的构造器
* Constructor[] getDeclaredConstructors()():得到所有的声明的构造器
*/
count = 0;
Constructor[] constructors = clazz.getDeclaredConstructors();
for (Constructor constructor : constructors) {
count++;
int cMod = constructor.getModifiers();
System.out.println(count + ":构造器的修饰符:" + Modifier.toString(cMod));
System.out.println(count + ":构造器的名称:" + constructor.getName());
Class[] parameterTypes = constructor.getParameterTypes();
System.out.println(count + ":构造器的形参列表:" + Arrays.toString(parameterTypes));
}
/* (1)Method[] getMethods(); 得到所有公共的方法
* (2)Method[] getDeclaredMethods(); 得到所有声明的方法
*/
count=0;
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method method : declaredMethods) {
count++;
int mMod = method.getModifiers();
System.out.println(count + ":方法的修饰符:" + Modifier.toString(mMod));
System.out.println(count +":方法的返回值类型:" + method.getReturnType());
System.out.println(count + ":方法的名称:" + method.getName());
System.out.print(count + ":抛出的异常类型们:");
Class<?>[] exceptionTypes = method.getExceptionTypes();
System.out.println(Arrays.toString(exceptionTypes));
Class[] parameterTypes = method.getParameterTypes();
System.out.println(count + ":方法的形参列表:" + Arrays.toString(parameterTypes));
}
}
@Test
public void test03(){
int mod = String.class.getModifiers();
System.out.println("修饰符的值:" + mod);
System.out.println("修饰符:" + Modifier.toString(mod));
}
}
编写AtGuiguDemo
public class AtGuiguDemo implements Serializable,Comparable<AtGuiguDemo> {
private static final long serialVersionUID = 1L;
private int id;
private String info;
private int num;
public AtGuiguDemo(int id, String info, int num) {
super();
this.id = id;
this.info = info;
this.num = num;
}
public AtGuiguDemo() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "AtGuiguDemo [id=" + id + ", info=" + info + ", num=" + num + "]";
}
@Override
public int compareTo(AtGuiguDemo o) {
return 0;
}
//编译没有及时更新,为了兼容老版本的代码
/* @Override
public int compareTo(Object o) {
return 0;
}*/
public static void test(int a){
System.out.println("a = " + a);
}
}