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

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");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章