0Pricing
Java Academy · 课时

反射与配置

处理动态特性

反射与配置 是 CoddyKit 上的免费 Java Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

反射与配置

原生映像工具的封闭世界分析只能看到能够静态追踪的代码。动态功能——反射、代理、资源和序列化——会将其目标隐藏在分析器之外。本课将解释如何让这些功能在原生二进制文件中正常工作。

反射的问题

当您根据字符串中的名称查找类时,分析器无法知道您指的是哪个类。如果该类在其他情况下不可达,它就会被排除在映像之外,查找也会在运行时失败。

public class Main {
    public static void main(String[] args) throws Exception {
        String name = "java.util.ArrayList"; // could come from config
        Class<?> c = Class.forName(name);
        System.out.println("Loaded: " + c.getSimpleName());
    }
}

可达性元数据

解决方法是使用可达性元数据:这些 JSON 文件会告诉原生映像工具哪些类、方法和字段会被动态访问。构建过程随后会保留这些内容,并记录其成员。

reflect-config.json

反射条目会指定要保留的类及其成员。这段内容是 JSON,而不是 Java——它位于 META-INF/native-image/ 下。

[
  {
    "name": "com.example.Person",
    "allDeclaredConstructors": true,
    "allDeclaredMethods": true,
    "fields": [ { "name": "age" } ]
  }
]

跟踪代理

手动编写元数据十分繁琐。请在 JVM 上使用跟踪代理运行应用程序(-agentlib:native-image-agent=config-output-dir=...)。它会记录真实运行期间发生的每次动态访问,并自动生成配置文件。

运行所有代码路径

代理只会记录实际执行的内容,因此您必须让应用程序运行其所有功能——在代理下运行您的测试。任何遗漏的反射路径都会缺少相应的元数据,并在原生构建中导致失败。

动态代理

JDK 动态代理需要一个 proxy-config.json,其中列出要进行代理的接口集合。由于接口列表是在运行时组装的,分析器无法推断出这些集合。

资源

通过 getResourceAsStream 加载的文件不会自动嵌入。包含通配模式的 resource-config.json 会告诉原生映像工具哪些资源应打包到可执行文件中。

public class Main {
    public static void main(String[] args) {
        var url = Main.class.getResource("/banner.txt");
        System.out.println("Resource present: " + (url != null));
    }
}

序列化与 JNI

Java 序列化和原生(JNI)调用同样属于动态功能。它们各自拥有配置文件(serialization-config.json、jni-config.json)。当这些路径被执行时,跟踪代理也会生成相应配置。

以编程方式注册

库作者可以在代码中通过 RuntimeReflection API 使用 Feature 注册元数据,并在构建时执行注册逻辑。这样,库就能在内部附带正确的配置,用户无需手动设置。

共享元数据仓库

GraalVM 维护着一个社区可达性元数据仓库,其中包含热门库的预构建配置。原生构建工具可以自动获取这些配置,因此常见框架无需额外设置即可使用。

快速检查

检查您对原生映像中动态功能的理解。

回顾

您学会了如何处理动态功能:

  • 反射、代理、资源、序列化和 JNI 对静态分析不可见。
  • 可达性元数据 JSON 文件会向原生映像工具声明这些内容。
  • 跟踪代理会根据真实的 JVM 运行自动生成配置。
  • 运行所有代码路径(尤其是测试),确保没有遗漏。
  • 对热门库使用共享元数据仓库。

常见问题解答

「反射与配置」课时是免费的吗?

是的 — 「反射与配置」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「反射与配置」这节课中我会学到什么?

处理动态特性 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「反射与配置」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 什么是 GraalVM
  2. 构建原生映像
  3. 反射与配置
  4. 原生映像的权衡
← 返回 Java Academy