java_[类加载器]

Class 与 类加载

  • Class对象由JVM自动产生,每当一个类被加载时,JVM就自动为其生成一个Class对象,通过Class对象可以获得类的相关信息。
  • 将类信息读到内存中过程,称为类加载
  • Java在需要使用某个类时,才会将该类进行加载,而不是在程序启动时就加载所有的类。

  • 所谓真正需要是指生成类的对象或类被加载时 new ,  Class.forName() ,  ClassLoader

Ø加载class对象

有6种情况JVM会加载Class对象

  • 使用new关键字创建对象时。
  • 通过反射创建对象时。
  • 调用某个类的static方法时。
  • 调用某个类的static属性时。
  • 当初始化某个类的子类时。
  • 某个类标明为main() 函数类(启动类) 。

ØClass.forName加载类

  • 实现动态加载类
  • static Class forName(String name)
  • static Class forName(String name, boolean initialize, ClassLoader loader)
  • 类的具体路径 设为false代表在加载类时不会立即运行静态块,而会在使用类建立对象时才运行静态块。
  • 类加载器 Thread.currentThread().getContextClassLoader() —— 获得当前主线程的类加载器

Øjava代码 

public class Demo1 {
    public static void main(String[] args) {
        String s = new String("wenhaitao");
        //1. getClass()
        Class cls= s.getClass();
        System.out.println("leiming" + cls.getName());
        System.out.println("baoming" + cls.getPackage());
        System.out.println("是否为接口:" + cls.isInterface());
        System.out.println("是否为基本类型:" + cls.isPrimitive());
        System.out.println("是否为数组:" + cls.isArray());
        System.out.println("String类的父类:" + cls.getSuperclass());

        //2.Class
        Class cls1 = String.class;
        System.out.println("类名:" + cls1.getName());
        System.out.println("包名:" + cls1.getPackage());
        System.out.println("是否为接口:" + cls1.isInterface());
        System.out.println("是否为基本类型:" + cls1.isPrimitive());
        System.out.println("是否为数组:" + cls1.isArray());
        System.out.println("String类的父类:" + cls1.getSuperclass());

        System.out.println(cls == cls1);
        int a = 100;
        System.out.println(int.class);
    }
}

Ø获取一个对象的父类与实现接口

public class Demo4 {
    public static void main(String[] args) {
        Class clz;//类对象
        ClassLoader cl, cl1;//类加载器

        clz = String.class;
        cl = clz.getClassLoader();//得到加载String类对象的类加载器
        System.out.println("加载String类对象的加载器:" + cl);
        //当类加载器为null的时候,表示的是BootStrapLoader

        System.out.println("******************************");
        clz = Demo4.class;
        cl = clz.getClassLoader();
        System.out.println("加载Demo4类对象的类加载器:" + cl);
        while(cl!=null) {
            cl1 = cl;
            cl = cl1.getParent();//得到父加载器
            System.out.println(cl1+"的父加载器是:" + cl);
        }

    }
}

  别荒废了最能拼的年纪,让自己整天无所事事。自己那么差又不努力,还有什么资格唉声叹气。

  为了自己想要的未来,无论现在有多难熬,都必须得满怀信心的坚持下去。

原文地址:https://www.cnblogs.com/dyywht/p/13537390.html