`

反射和类装载器ClassLoader

阅读更多
  类装载器工作机制:

  类装载器就是寻找类的字节码文件并构造出类在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);   
  }
}
       
2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics