反射与配置
处理动态特性
反射与配置 是 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 反馈 — 无需本地设置。