java疯狂讲义笔记之类加载机制与反射

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.使用反射生成并操作对象

创建类实例的两种方式:

  1. 通过Class的newInstance()方法,要求该Class对象对应类有默认构造方法。
  2. 先获取指定的Constructor对象,再调用其newInstance()方法。

Spring框架就是采用配置文件来创建对象的方式。
创建方法对象和属性对象亦如此。

7.使用Proxy和InvocationHandler创建动态代理

AOP动态代理,可解耦,面向切面编程。

8.反射和泛型

反射和泛型结合可以使代码更具灵活性

猜你喜欢

转载自blog.csdn.net/Chushiniudao/article/details/88950810
今日推荐