类加载器
类的声明周期是加载、验证、准备、解析、初始化、使用、卸载。类的加载过程是加载、连接(验证、准备、解析)、初始化。
类加载器的分类是引导类加载器BootstrapClassLoader、扩展类加载器ExtClassLoader、系统类加载器AppClassLoader。
AppClassLoader的父类是ExtClassLoader,ExtClassLoader的父类是BootstrapClassLoader。
加载自定义类的流程。AppClassLoader类加载器会先检查它的缓存,若有则已被加载,若没有则上交给ExtClassLoader加载器,
同理若有则已被加载若没有则上交给BootstrapClassLoader若有则已加载,若没有则查看它负责的目录中尝试加载,
若加载失败则下交给ExtClassLoader加载器,以此直到下交直到AppClassLoader类加载器从他负责的classpath尝试加载,加载完成。
反射
获取Class类对象的三种方式
类名.Class、对象名.getClass()、Class.forName()。
反射获取构造方法并使用
Class类获取狗砸方法
Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>... parameterTypes) 返回单个公共构造方法对象(括号里面是参数)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回单个构造方法对象(括号里面是参数)
用于创建爱你对象的方法
T newInstance(Object... initargs) 根据指定的构造方法创建对象(括号里面是实参)
反射获取成员变量并使用
Class类获取成员变量对象的方法
Field[] getFields() 返回所有公共成员变量对象的数组
Field[] getDeclaredFields() 返回所有成员变量对象的数组
Field getField(String name) 返回单个公共成员变量对象
Field getDeclaredField(String name) 返回单个成员变量对象
void set(Object obj, Object value) 给obj对象的成员变量赋值为value
反射获取成员方法并使用
Class类获取成员方法对象的方法
Method[] getMethods() 返回所有公共成员方法对象的数组,包括继承
Method[] getDeclaredMethods() 返回所有成员方法对象的数组,不包括继承
Method getMethod(String name, Class<?>... parameterTypes) 返回单个公共成员方法对象。例如(int.class, String.class)
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回单个成员方法
Object invoke(Object obj, Object... args) 调用obj对象的成员方法,参数是args,返回值是Object类型
反射的综合案例
越过泛型检查
public class ReflectTest01 {
public static void main(String[] args) throws Exception {
ArrayList<Integer> array = new ArrayList<Integer>();
Class<? extends ArrayList> c = array.getClass();
Method m = c.getMethod("add", Object.class);
m.invoke(array,"hello");
m.invoke(array,"world");
m.invoke(array,"java");
System.out.println(array);
}
}
反射指定类的指定方法
public class ReflectTest02 {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
FileReader fr = new FileReader("myReflect\\class.txt");
prop.load(fr);
fr.close();
String className = prop.getProperty("className");
String methodName = prop.getProperty("methodName");
Class<?> c = Class.forName(className);
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
Method m = c.getMethod(methodName);
m.invoke(obj);
}
}