暑期学习:自学java第三十天
最后一章,第十八章笔记整理
-
类的“一生”:从加载到初始化
Java 类不是直接就能用的,它需要经历三个步骤,就像一个人出生、成长到独立的过程:
加载:把 .class 文件读进内存,并生成一个 Class 对象。你可以把这个 Class 对象理解为这个类的“身份证”。
连接:
验证:检查代码安不安全,格式对不对。
准备:给类的静态变量(static)分配内存,并给个默认值(比如 0 或 null)。
解析:把代码里的符号引用(比如类名)替换成直接的内存地址。
初始化:这是执行代码的阶段。主要是执行静态代码块(static{})和给静态变量赋真正的初始值。 -
类加载器:谁负责把类请进内存?
Java 虚拟机(JVM)里有一套分工明确的“搬运工”,叫类加载器。它们像公司里的层级一样:
根类加载器:老大,负责加载 Java 最核心的类(比如 String、System)。
扩展类加载器:老二,负责加载 Java 的扩展类库。
系统类加载器:老三,负责加载我们程序员自己写的类,或者 classpath 路径下的类。
自定义类加载器:还可以自己写一个加载器(比如从网络上下载加密的 class 文件来加载)。 -
反射:Java 的“透视眼”和“动态手”
反射是 Java 最强大的特性之一。通常我们写代码是 Person p = new Person(),但在运行时,如果我们不知道类名,只知道一个字符串 "Person",怎么创建对象呢?这就靠反射。
获取 Class 对象:这是反射的入口。每个类加载后都有一个 Class 对象。可以通过 类名.class、对象.getClass() 或 Class.forName("全类名") 来获取它。
动态操作:拿到了 Class 对象,你就可以像拥有“上帝视角”一样操作这个类:
看构造器:获取所有构造方法,甚至私有的,然后动态创建对象。
看方法:获取所有方法,然后动态调用(method.invoke)。
看属性:获取成员变量,甚至能强行修改 private 私有变量的值(暴力反射)。
看注解:检查类或方法上有没有贴特定的标签(注解)。 -
动态代理与 AOP:不修改代码的“功能增强”
这是反射的一个高级应用,也是 Spring 框架的核心原理之一。
场景:假设有一个现成的对象(比如一个业务逻辑类),如果想在它的方法执行前后加点料(比如加个日志、加个事务控制),但又不想修改它原本的代码。
做法:利用 Proxy 和 InvocationHandler,Java 可以在内存中动态生成一个“代理对象”。
效果:这个代理对象长得和目标对象一模一样(实现了相同的接口)。当调用代理对象的方法时,它不会直接执行,而是先执行预设的逻辑(比如打印日志),然后再去调用真正的目标对象。这就是面向切面编程的雏形。 -
泛型与反射:获取“丢失”的类型信息
Java 的泛型在编译后会“擦除”(比如 List会变成 List),但在反射中,我们可以通过一些技巧找回这些信息。
关键点:普通的 getType() 只能拿到原始类型(如 List),但如果成员变量被 private Listlist 这样定义,可以通过 getGenericType() 拿到 ParameterizedType,从而解析出它里面装的是 String 类型。

浙公网安备 33010602011771号