public class Main {
public static void main(String[] args) {
try {
String className = "java.util.Collections";
Class<?> cl = Class.forName(className);
System.out.println(cl.getName());
} catch (Exception e) {
e.printStackTrace();
}
try {
long time = System.currentTimeMillis() / 1000L;
String className = time % 2 == 0 ? "java.util.Base64" : "java.util.Timer";
Class<?> cl = Class.forName(className);
System.out.println(cl.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
javac Main.java && native-image Main && ./main
输出
java.util.Collections
java.lang.ClassNotFoundException: java.util.Base64
或者
java.util.Collections
java.lang.ClassNotFoundException: java.util.Timer
需要用到 java -agentlib:native-image-agent=config-merge-dir=./src/main/resources/META-INF/native-image Main 将动态特性收集起来,这里的 java 是指 GraalVM 的 jdk ,然后再 native-image 编译
https://www.graalvm.org/latest/reference-manual/native-image/guides/use-reachability-metadata-repository-maven/https://www.graalvm.org/latest/reference-manual/native-image/metadata/AutomaticMetadataCollection/