要弄清楚反射,先得弄清楚类加载过程和Class类中的内容
类加载过程
- ClassLoader类有三个具体实现,
AppClassLoader
,ExtClassLoader
,BootStrapClassLoader
,并且类中有一个parent对象指向父加载器。 - 当执行类加载过程时,执行
loadClass()
方***对进行类的字符串进行加锁,并且先判断是否加载过这个类,如果父类不为空,则调用parent.loadClass()
;加载成功则直接返回Class对象。 - 当加载失败时会执行
findClass()
方法(用户来重写,默认直接抛出ClassNotFoundException
),在findClass()
中调用defineClass(name, b, 0, b.length)
来返回一个Class对象,通过类名和byte[]表示类。
Class类中的内容
反射(ToDo)
- 用途
- 创建实例
Class clazz = Class.forName("全类名"); // 需要强转一下类型,并且只有clazz有无参构造方法时才能调用该方法 clazz.newInstance();
- 调用方法
Class clazz = Class.forName("全类名"); // 获取Method Method method = clazz.getMethod(); method.invoke(obj, args);
- 创建实例