一.获取Class的三种方法
* 1.调用Class的forName方法(Class.forName(类的全路径))
* 2.直接调用类的getClass()方法(该方式是Object类的方法)(new User().getClass ( ) )
* 3.调用类的.class属性获取(User.class)
* 4.通过类加载器获取
* ClassLoader cl=ClassLoader.getSystemClassLoader()
* cl.loadClass(类的全路径名)
* 该方法与Class.forName不同的是不会触发类的初始化(类的静态代码不会运行)
* 二.获取属性,方法,构造器(构造方法)及其名称,返回值,修饰符
* 以user类及其映射userClass为例
* 1.获取类的名称(userClass.getName),获取类的修饰符(userClass.getModifiers)
* 但是该方法返回的是int类型,需要通过调用Modifier.toString方法获取完整名称
* 2.获取类的属性,调用userClass.getFields()方法返回所有public字段修饰的属性
* 若要获取所有的属性字段需要调用userClass。getDeclaredFields()方法两种方法返回的都是Field数组
* 3.获取属性的名称,返回值,修饰符及
* Field【】 fields=userClass。getDeclaredFields();
* for(Field field:fields){
* field.getName()获取属性名
* field.getType()返回值是一个class类型,获取属性的类的全路径名,可调用getSimpleName方法获取简名
* field.getModifiers() 返回int类型,通过Modifier.toString(field.getModifiers())获取名称
* }
* 4.获取类中的方法,方法的参数
* method
* userClass.getMethods()//获取所有public方法
* userClass.getDeclaredMethods()//获取所有的方法
* 通过调用method的.getReturnType()可以获得一个class类型的返回类型
* 通过调用method的getParameters方法可以获得一个Parameter【】数组因为方法中的参数不确定有多少
* 通过调用parameter.getName方法可以获得参数的名称,通过parameter.getType()可以获得类型
* 4.获取类中的构造方法
* 同过调用userClass.getConstructor(userClass.getDeclaredConstructor())
* 通过调用Constructor的instance()方法可以创建一个类的实例
* 三:双亲委派机制
* 类的加载有三个阶段(类的装入,类的编译,类的初始化)
* 当一个类加载时,类的加载器会先逐级向上委派给自己的父加载器因为防止类的加载重复,在类加载时父类若无法加载则
* 逐级向下委派给自己的子加载器