Add premain for static agent support by ziyilin · Pull Request #8988 · oracle/graal (original) (raw)

I would implement this as follows:

ArrayList<Class<?>> userClasses = new ArrayList<>();
            CodeInfo imageCodeInfo = CodeInfoTable.getFirstImageCodeInfo();
            while (imageCodeInfo.isNonNull()) {
                Class<?>[] classes = NonmovableArrays.heapCopyOfObjectArray(CodeInfoAccess.getClasses(imageCodeInfo));
                if (classes != null) {
                    for (Class<?> clazz : classes) {
                        if (clazz != null) {
                            Module module = clazz.getModule();
                            if (module == null ||
                                            module.getName() == null ||
                                            !isSystemClass(module)) {
                                userClasses.add(clazz);
                            }
                        }
                    }
                }
                imageCodeInfo = CodeInfoAccess.getNextImageCodeInfo(imageCodeInfo);
            }
            userClasses.trimToSize();
            return userClasses.toArray(new Class[0]);

where we have

private static final Set<String> systemModules = Set.of("org.graalvm.nativeimage.builder", "org.graalvm.nativeimage", "org.graalvm.nativeimage.base", "com.oracle.svm.svm_enterprise",
                    "org.graalvm.word", "jdk.internal.vm.ci", "jdk.graal.compiler", "com.oracle.graal.graal_enterprise");

    private static boolean isSystemClass(Module module) {
        return systemModules.contains(module.getName());
    }

Please re-use systemModules in com.oracle.svm.hosted.classinitialization.ClassInitializationSupport#isAlwaysReached. @loicottet we can use that list later for the list of types where reflection is prohibited.

CC @christianwimmer