1. 反射机制fsh

  • 概念:就是运行时动态地获取类的信息和操作类的方法和属性
  • 获取Class对象方法:class,getClass(),Class.forname,CalssLoader.loadClass

  • Class类方法:getClasLoader,forname,getdeclareemethod,getdeclaredfield,getconstrutor(declared可以获取所有方法,不加只获取public方法)

2.Class.forName和classloader.loadClass的区别

  • foranme在类加载的时候回执行静态代码块
  • loadclass只有在调用newInstance方法的时候才会执行静态代码块

  • 初始化不同:Class.forName()会对类初始化,而loadClass()只会装载或链接。可见的效果就是类中静态初始化段及字节码中对所有静态成员的初始工作的执行(这个过程在类的所有父类中递归地调用). 这点就与ClassLoader.loadClass()不同. ClassLoader.loadClass()加载的类对象是在第一次被调用时才进行初始化的。 你可以利用上述的差异. 比如,要加载一个静态初始化开销很大的类, 你就可以选择提前加载该类(以确保它在classpath下), 但不进行初始化, 直到第一次使用该类的域或方法时才进行初始化

  • 类加载器不用:Class.forName(String) 方法(只有一个参数), 使用调用者的类加载器来加载, 也就是用加载了调用forName方法的代码的那个类加载器。当然,它也有个重载的方法,可以指定加载器。 相应的, ClassLoader.loadClass()方法是一个实例方法(非静态方法), 调用时需要自己指定类加载器, 那么这个类加载器就可能是也可能不是加载调用代码的类加载器(调用代用代码类加载器通getClassLoader0()获得)

results matching ""

    No results matching ""