1.类加载
运行一个程序时,就会启动一个JVM进程。而当程序主动使用某个类时,系统就会通过 加载、连接、初始化 ,将class文件读入内存,并为之创建一个java.lang.class的对象,这就是 类加载。 系统中所有的类都是java.lang.Class的实例2.类连接的过程
类加载过后会产生一个Class对象,接着将会进入连接阶段,把类的二进制数据合并到JRE中。此过程分为三个阶段: 验证、准备、解析。3.类初始化的过程
类初始化就是对类变量进行初始化。JVM初始化一个类包含以下几个步骤:1.假如这个类没有被加载和连接,则程序先加载并连接该类
2.假如该类的直接父类还没有被初始化,则先初始化其直接父类
3.假如类中有初始化语句,则系统依次执行这些语句
4.执行父类初始化也遵循这三个步骤
使用final修饰的类变量相当于一个常量,使用它时不会导致类的初始化。
4.类加载器以及实现机制
JVM中的三个类加载器:Bootstrap ClassLoader:根加载器(加载核心类,不是由java实现)
Extension ClassLoader:扩展类加载器(加载%JAVA_HOME%/jre/lib/ext里的JAR包,所以可以把自己写的JAR包放进去然后使用)
System ClassLoader:系统类加载器(可以通过ClassLoader的静态方法getSystemClassLoader()获取)
三种类加载机制:全盘负责、父类委托、缓存机制
自定义类加载器推荐实现ClassLoader的findClass()方法
运行命令行命令:Runtime.getRuntime().exec(“具体命令”);
使用自定义类加载器的好处:可以验证数字签名、混淆代码、根据需求灵活加载类、把其它数据以字节码的形式加载到应用中(不行自定义的话可以使用URLClassLoader)。
5.通过反射查看类信息
获取class对象的三种方式:
- Class.forName():参数要添加完整类名
- 调用某个类的class属性
- 调用某个对象的getClass()方法
从Class类里获取信息:
- 构造器
- 方法
- 注解
- 所在外部类
- 类的修饰符、所在包、类名等基本信息
程序可以根据获取的这些对象来执行实际的功能,如调用方法、创建实例。
6.使用反射生成并操作对象
创建类实例的两种方式:
- 通过Class的newInstance()方法,要求该Class对象对应类有默认构造方法。
- 先获取指定的Constructor对象,再调用其newInstance()方法。
Spring框架就是采用配置文件来创建对象的方式。
创建方法对象和属性对象亦如此。
7.使用Proxy和InvocationHandler创建动态代理
AOP动态代理,可解耦,面向切面编程。
8.反射和泛型
反射和泛型结合可以使代码更具灵活性