《疯狂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");
上一篇: python学习第三天-学习如何定义函数