1.程序的运行过程
2.ClassLoader的类加载机制:①并非一次性加载 ②运行期间动态加载
3.使用-verbose:class命令观察class的load过程
4.static静态语句块在class被load完成后被调用一次(仅一次),动态语句块每new一次执行一次,等同构造方法中的语句
5.JDK内置的ClassLoader
6.bootstrap class loader : 载入其他的classloader和最核心的类,使用操作系统本地语言(native language)编写,没有名字(其他class load都是用java写的)
7. 使用 类名.class获取Class,使用类名.class.getClassLoader()获取ClassLoader
8.使用 类名.class.getClassLoader().getClass().getName()来获取类装载器的名字
9.ClassLoader可以自己创建(继承抽象类ClassLoader)
10.class loader对象(!)之间的层次关系(非继承关系)
下层classloader对象有一个引用parent指向上层对象,可以使用getParent()方法获得引用parent。bootstrap class loader不能被指向,因为它是C++编写的,但在逻辑上是被ext class loader指向的
11.加载一个class的过程:底层classloader询问上层classloader是否已经加载该class,其上层classloader继续向更上层classloader询问(如此向上),若已加载则不重复加载提高了安全性(如自己写的String.class不会被重复加载)
12.在ClassLoader的角度来看,每个code segment中的.class都是一个Class对象
13.Object的方法getClass()可以获得该类对象(等同于类名.class)
14.Class的getClassLoader()方法获得装载这个类ClassLoader
15.通过java.lang.reflect包中的Field(属性)和Method(方法)两个类可以将类对象中的属性和方法也看做对象
16.通过Class.forName(类名)来载入一个类,这个静态方法返回这个类的Class对象,通过Class对象的newInstance()方法创建出该类的实例
17.Class对象的getMethods()方法可以获取类中的方法对象,返回Method数组
18.Method对象的常用方法
getName() 获取方法名
invoke(调用该方法的对象,方法参数,方法参数,...) 执行该方法
getReturnType() 获取该方法的返回值类型(返回Class类型)
getParameterTypes() 获取该方法的各个参数类型(返回Class类型数组)