暑期学习:自学java第三十天

最后一章,第十八章笔记整理

  1. 类的“一生”:从加载到初始化
    Java 类不是直接就能用的,它需要经历三个步骤,就像一个人出生、成长到独立的过程:
    加载:把 .class 文件读进内存,并生成一个 Class 对象。你可以把这个 Class 对象理解为这个类的“身份证”。
    连接:
    验证:检查代码安不安全,格式对不对。
    准备:给类的静态变量(static)分配内存,并给个默认值(比如 0 或 null)。
    解析:把代码里的符号引用(比如类名)替换成直接的内存地址。
    初始化:这是执行代码的阶段。主要是执行静态代码块(static{})和给静态变量赋真正的初始值。

  2. 类加载器:谁负责把类请进内存?
    Java 虚拟机(JVM)里有一套分工明确的“搬运工”,叫类加载器。它们像公司里的层级一样:
    根类加载器:老大,负责加载 Java 最核心的类(比如 String、System)。
    扩展类加载器:老二,负责加载 Java 的扩展类库。
    系统类加载器:老三,负责加载我们程序员自己写的类,或者 classpath 路径下的类。
    自定义类加载器:还可以自己写一个加载器(比如从网络上下载加密的 class 文件来加载)。

  3. 反射:Java 的“透视眼”和“动态手”
    反射是 Java 最强大的特性之一。通常我们写代码是 Person p = new Person(),但在运行时,如果我们不知道类名,只知道一个字符串 "Person",怎么创建对象呢?这就靠反射。
    获取 Class 对象:这是反射的入口。每个类加载后都有一个 Class 对象。可以通过 类名.class、对象.getClass() 或 Class.forName("全类名") 来获取它。
    动态操作:拿到了 Class 对象,你就可以像拥有“上帝视角”一样操作这个类:
    看构造器:获取所有构造方法,甚至私有的,然后动态创建对象。
    看方法:获取所有方法,然后动态调用(method.invoke)。
    看属性:获取成员变量,甚至能强行修改 private 私有变量的值(暴力反射)。
    看注解:检查类或方法上有没有贴特定的标签(注解)。

  4. 动态代理与 AOP:不修改代码的“功能增强”
    这是反射的一个高级应用,也是 Spring 框架的核心原理之一。
    场景:假设有一个现成的对象(比如一个业务逻辑类),如果想在它的方法执行前后加点料(比如加个日志、加个事务控制),但又不想修改它原本的代码。
    做法:利用 Proxy 和 InvocationHandler,Java 可以在内存中动态生成一个“代理对象”。
    效果:这个代理对象长得和目标对象一模一样(实现了相同的接口)。当调用代理对象的方法时,它不会直接执行,而是先执行预设的逻辑(比如打印日志),然后再去调用真正的目标对象。这就是面向切面编程的雏形。

  5. 泛型与反射:获取“丢失”的类型信息
    Java 的泛型在编译后会“擦除”(比如 List 会变成 List),但在反射中,我们可以通过一些技巧找回这些信息。
    关键点:普通的 getType() 只能拿到原始类型(如 List),但如果成员变量被 private List list 这样定义,可以通过 getGenericType() 拿到 ParameterizedType,从而解析出它里面装的是 String 类型。

posted @ 2026-08-14 19:48  hxzzzzzzz  阅读(1)  评论(0)    收藏  举报