利用反射可以获得类的信息 比如属性,方法,有参无参构造方法
package day0204;
import java.util.ArrayList;
import java.lang.reflect.*;
public class TestClass {
/*
* 类的对象:就是通过类实例化出来的一个对象
* 类对象:是类文件(**.class)加载jvm的产品,其中类对象记载了类名,属性,方法,构造方法
* 类对象就好比动物园动物的简介,上面叙述了某种动物的特点,然后笼中的动物就是 类 的实例化对象
* 问题:如果获取类对象呢?
* Field对象 存放所有类的属性对象
* */
public static void main(String[] args) throws Exception{ //声明了下面如果发生异常就throws一个异常出来
Class c1 = ArrayList.class; //返回类对象
Class c2 = new ArrayList().getClass(); //返回的是类对象
Class c3 = new ArrayList().getClass(); //类的对象.getClass 返回的是类对象
Class c4 = Class.forName("java.util.ArrayList"); //获取ArrayList的类对象 而不是类的对象 不能省略包名
/*
* 注意forName,如果本来ArrayList这个类没有加载的话,forName就会加载一次ArrayList,然后返回类对象
* 为什么想要加载这个类?因为加载这个类,就能调用静态代码块
* */
System.out.println(c1==c2); //结果 true
System.out.println(c2==c3); //结果 true
System.out.println(c3==c4); //结果 true 都是同一个类
System.out.println(c1.getName()); //返回类名
System.out.println(c1.getPackageName());
System.out.println(c1.getSuperclass());
Class[] cc = c1.getInterfaces(); //返回的是类对象的数组 返回ArrayList的直接继承接口
for(Class c:cc) {
System.out.println(c.getName());
//Serializable Clonable List RandomAccess 其中ArrayList直接继承了List接口。List直接继承了Collection,Iterable接口
}
System.out.println("-------------------------------------------属性");
/*
* 获取类的属性对象 属性包括属性值 属性名 属性类型 属性初始值 这些共同构成属性对象。这个属性对象被装在Field里面 Field相当于于一个容器
* 类对象存储类的信息,那么属性对象存储属性的信息 一个方法信息存放在Method对象里面,构造方法信息则存储在Constructor对象里面
* 注意:类对象.getFields()方法的是本类或者父类的 公开的 属性,私有无法访问 ArrayList本类以及父类没有公开属性
* 类对象.getDeclaredFields()获取类对象 本类的所有的属性 无论是公开还是私有,但是不能获取父类
* */
Field[] fs = c2.getDeclaredFields();
for(Field f :fs) {
System.out.println(f);
}
System.out.println("-------------------------------------------方法");
/*
* 类对象.getMethods() 获取本类 父类的 公开方法 返回是Method数组
* 类对象.getDeclareMethods() 获取 本类所有 public/private/proteced方法
* */
Method[] ms = c2.getDeclaredMethods();
for(Method m :ms) {
System.out.println(m); //不仅返回本类公开方法且返回从父类继承的公开方法
}
System.out.println("--------------------------------------------构造方法");
/*
* 类对象.getConstructors() 获取本类 父类的 公开有参/无参构造方法 返回的是Constructor数组
* 类对象.getDeclaredConstructor() 获取本类 的有参或者无参构造方法
* */
Constructor[] cs = c2.getDeclaredConstructors();
for(Constructor c:cs) {
System.out.println(c);
}
}
}
网友评论