类装载器工作机制:
类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。类装载器将类装入JVM中,要经过以下步骤:
1.装载:查找和导入class文件
2.链接:执行校验、准备、和解析步骤
校验:检查载入class文件数据的正确性
准备:给类的静态变量分配存储空间
解析:将符号引用转成直接引用。
3.初始化:对类的静态变量、静态代码块执行初始化工作。
类装载工作由classLoader及其子类负责。JVM在运行时会产生三个classLoader:根装载器、ExtClassLoader和appClassLoader。ExtClassLoader和appClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE扩展目录ext中的jar类包。AppclassLoader负责装载classpath路径下的类包。
ClassLoader重要方法:
1.Class loadClass(String name)
2.Class defineClass(String name,byte[]b,int off,int len)
3.Class findLoaderClass(String name)
4.Class findSystemClass(String name)
5.ClassLoader getParent()
反射:
Constructor:类的构造函数反射类,通过getConstructors()或者getConstructor(Class parameterTypes)方法获取类的所有构造函数反射对象数组。
主要方法:newInstance(Object[] initargs)
Method:类方法反射类,通过getDeclaredMethods()或者getDeclaredMethod(String name,class parameterTypes)获取方法。
主要方法为:invoke(Object obj,Object[]args),obj表示操作的目标对象,args为方法入参。
其他方法:Class getReturnType();获取方法返回值类型
Class[] getParameterTypes();获取方法的入参类型数组
Class[] getExceptionTypes() 获取方法的异常类型数组
Field:类的成员变量反射类,通过getDeclaredFields()或者getDeclaredField(String name)方法获取类的成员变量数组或者特定类的成员变量反射对象。
主要方法:set(Object obj,Object value),obj表示操作的目标对象,value为目标对象的成员变量设置值。
例子:
public class PrivateCar {
private String color;
protected void drive(){
System.out.println("drive private car! the color is:"+color);
}
}
public class PrivateCarReflect {
public static void main(String[] args) throws Throwable{ ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.baobaotao.reflect.PrivateCar");
PrivateCar pcar = (PrivateCar)clazz.newInstance();
Field colorFld = clazz.getDeclaredField("color");
colorFld.setAccessible(true);
colorFld.set(pcar,"红色");
Method driveMtd = clazz.getDeclaredMethod("drive",(Class[])null);
//Method driveMtd = clazz.getDeclaredMethod("drive"); JDK5.0下使用
driveMtd.setAccessible(true);
driveMtd.invoke(pcar,(Object[])null);
}
}
反射和类装载器ClassLoader
猜你喜欢
转载自lafecat.iteye.com/blog/2042280
今日推荐
周排行