发新话题
打印

java类加载的表现形式

java类加载的表现形式

java中的类是静态加载的, 我们先看一下我们常用的类加载方式, 先有一个理性的看法, 才干进一步
  深化讨论, 类加载无非就是上面三种方式。
  class A{}
  class B{}
  class C{}
  public class Loader{
  public static void main(String[] args) throws Exception{
  Class aa=A. class;
  Class bb=Class. forName("B");
  Class cc=ClassLoader. getSystemClassLoader(). loadClass("C");
  }
  }
  我们先看. class字面量方式, 很多人可能不知道这种方式, 由于这种用法不是普通java语法。
  通过javap我们可以发现, 这种方式的大致等价于定义了一个静态成员变量
  static Class class$0;(后面的编号是增长的)
  你可以试图再定义一个 static Class class$0, 应该会收到一个编译错误(重复定义)。
  Class aa=A. class;
  就相当于
  if(class$0==null){
  try{
  Class. forName("A");
  }
  cacth(ClassNotFoundException e){
  throw new NoClassDefFoundError(e);
  }
  }
  Class aa=class$0;
  可以很清楚的看到, 这种类的字面量定义其实不是加载类的方式, 而是被编译器处置了, 实质上是运用了Class. forName方法, 但是运用这
种方式有一个很大的好处就是不用途理异常, 由于编译器处置的时分假如找不到类会抛出一个NoClassDefFoundError. 也许你觉得需求处置
ClassNotFoundException这种异常, 事实上99%的状况下我们可以把这种异常以为是一个错误。
  所以大部分状况我们运用这种方式会更简约。
  最常用的方式就是Class. forName方式了, 这也是一个通用的上层调用。 这个方法有两个重载, 可能很多人都忽略了第二个方法。
  public static Class forName(String name) throws
ClassNotFoundException
  public static Class forName(String name,  boolean
initialize, ClassLoader loader) throws ClassNotFoundException
  第二个方法后面多了两个参数, 第二个参数表示是否初始化, 第三个参数为指定的类加载器。
  在上面的例子中:
  Class bb=Class. forName("B");
  等价于
  Class bb=Class. forName("B", true, Loader. class. getClassLoader());
  这里要详细说一下这个类的初始化这个参数, 假如这个参数为false的话, 类中的static成员不会被初始化, static语句块也不会被执
行。
  也就是类虽然被加载了, 但是没有被初始化, 不过在第一次运用时依然会初始化。
  所以我们有时分会看到Class. forName("XXX")。 newInstance()这样的语句, 为什么这里要创立一个不用的实例呢?
不过是为了保证类被初始化(兼容以前的零碎)。
  其实第二个方法是比较难用的, 需求指定类加载器, 假如不指定而且又没有装置平安管理器的化, 是无法加载类的, 只需看一下具体的实现就明白了。
  最本质的方式当然是直接运用ClassLoader加载了, 所有的类最终都是通过ClassLoader加载的, Class
cc=ClassLoader. getSystemClassLoader()。 loadClass("C");这里通过运用零碎类加载器来加载某个类,
很直接的方式, 但是很遗憾的是通过这种方式加载类, 类是没有被初始化的(也就是初始化被延迟到真正运用的时分)。 不过我们也可以借鉴上面的经验, 加载后实
例化一个对象Class
cc=ClassLoader. getSystemClassLoader()。 loadClass("C")。 newInstance()。程海湖
  这里运用了零碎类加载器, 也是最常用的类加载器, 从classpath中寻觅要加载的类。
  java中默认有三种类加载器:引导类加载器, 扩展类加载器, 零碎类加载器。
  java中的类加载有着规范的层次结构, 假如我们要了解类加载的过程, 需求明确知道哪个类被谁加载, 某个类加载器加载了哪些类等等, 就需求深化
了解ClassLoader的本质。
  以上只是类加载的外表的东西, 我们还将讨论深层次的东西。
jiyizhen-buy.com颈椎保健枕太空记忆枕 igerl.com歌瑞尔内衣

TOP

发新话题