欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《疯狂Java讲义》学习笔记(十四)类加载机制与反射

程序员文章站 2022-06-06 21:22:01
...

1、类的加载、连接和初始化

  • JVM和类
    同一个JVM的所有线程、所有变量都处于同一个进程里,它们都使用该JVM进程的内存区
    当系统出现一下集中情况时,JVM进程将被终止:
    程序运行到最后正常结束
    程序运行到使用Sytem.exit()或Runtime.getRuntime().exit()代码处结束程序
    程序执行过程中遇到未捕获的异常或错误而结束
    程序所在平台强制结束JVM进程
    当JVM进程结束时,该进程在内存中的状态将会丢失
  • 类加载(当程序主动使用某个类,将类的class文件读入内存,并为之创建一个java.lang.Class对象)
    从本地class文件加载
    从JAR加载clas文件
    网络加载class文件
    动态编译Java源文件并执行加载
  • 类的连接
    验证:验证语法是否正确
    准备:为静态属性分配内存及设置默认值
    解析:将类的二进制数据中的符号引用替换成直接引用???
  • 类的初始化(静态属性初始化)
    声明静态属性时指定初始值
    使用静态初始化块为静态属性指定初始值
  • 类的初始化时机
    new一个实例、反射创建实例、反序列化创建实例
    调用某个类的静态方法
    访问某个类或接口的静态属性,或为静态属性赋值
    反射创建某个类或接口的java.lang.Class对象
    初始化某个类的子类、孙类等
    直接使用java.exe运行某个主类
    注意:final型静态属性,如果编译时就有属性值则是常量,被调用时,该类不会被初始化。如果是运行时编译的,被调用时,该类会初始化,如:
    static final String time = System.currentTimeMillis() + “”;
    精妙例子:http://www.jb51.net/article/86629.htm
  • 类加载器
Bootstrap ClassLoader:根类加载器
Extension ClassLoader:扩展类加载器
System ClassLoader:系统类加载器
ClassLoader loader = TestClassLoader.class.getClassLoader();
// sun.misc.Launcher$AppClassLoader@500c05c2     System.out.println(loader.toString());
// sun.misc.Launcher$ExtClassLoader@454e2c9c     System.out.println(loader.getParent().toString());
// null     System.out.println(loader.getParent().getParent());

2、反射

  • 对象运行的类型:
    编译时类型
    运行时类型(需要用反射来调用)
  • 作用
    假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。
  • 获取
  • 如果编写代码的时候,就知道Class的名字,可以直接用如下方式得到Class对象:
    Class exampleObjectClass = ExampleObject.class;
  • 如果在编写代码的时候,不知道类的名字,但是在运行时的时候,可以得到一个类名的字符串,可以用如下的方式获取Class对象:
Class exampleObjectClass = Class.forName("cn.byhieg.reflectiontutorial.ExampleObject");
相关标签: Java 入门教程