diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/Feature.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/Feature.java
index 67430aefd108..40fb70adbf1f 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/Feature.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/Feature.java
@@ -171,6 +171,14 @@ interface IsInConfigurationAccess extends FeatureAccess {
*/
@Platforms(Platform.HOSTED_ONLY.class)
interface AfterRegistrationAccess extends FeatureAccess {
+ /**
+ * Creates access for runtime registration. All registrations should happen in
+ * {@link Feature#afterRegistration}
+ *
+ */
+ ReflectionDynamicAccess createReflectionDynamicAccess();
+
+ ResourceDynamicAccess createResourceDynamicAccess();
}
/**
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/InclusionCondition.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/InclusionCondition.java
new file mode 100644
index 000000000000..5e2cb943982d
--- /dev/null
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/InclusionCondition.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * The Universal Permissive License (UPL), Version 1.0
+ *
+ * Subject to the condition set forth below, permission is hereby granted to any
+ * person obtaining a copy of this software, associated documentation and/or
+ * data (collectively the "Software"), free of charge and under any and all
+ * copyright rights in the Software, and any and all patent rights owned or
+ * freely licensable by each licensor hereunder covering either (i) the
+ * unmodified Software as contributed to or provided by such licensor, or (ii)
+ * the Larger Works (as defined below), to deal in both
+ *
+ * (a) the Software, and
+ *
+ * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
+ * one is included with the Software each a "Larger Work" to which the Software
+ * is contributed by such licensors),
+ *
+ * without restriction, including without limitation the rights to copy, create
+ * derivative works of, display, perform, and distribute the Software and make,
+ * use, sell, offer for sale, import, export, have made, and have sold the
+ * Software and the Larger Work(s), and to sublicense the foregoing rights on
+ * either these or other terms.
+ *
+ * This license is subject to the following condition:
+ *
+ * The above copyright notice and either this complete permission notice or at a
+ * minimum a reference to the UPL must be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+package org.graalvm.nativeimage.hosted;
+
+import org.graalvm.nativeimage.impl.TypeCondition;
+
+/**
+ * Condition that needs to be satisfied for inclusion of elements for runtime access.
+ * {@link InclusionCondition} is used with {@link ReflectionDynamicAccess} and
+ * {@link ResourceDynamicAccess} for programmatic registration of metadata.
+ *
+ * Currently, there is only two types of condition: typeReached and typeReachable(legacy)
+ *
typeReached (the default) that signifies that the type must be both reachable by
+ * static analysis at build time, and reached at run time. A type is reached at run time, right
+ * before the class-initialization routine starts for that type, or any of the type's subtypes are
+ * reached.
+ *
+ * User can only create typeReached conditions, since typeReachable are
+ * deprecated. Conditions are created via {@link InclusionCondition#alwaysInclude} and
+ * {@link InclusionCondition#typeReached} factory methods.
+ */
+public interface InclusionCondition {
+
+ /**
+ * Creates the type-reached condition that is always satisfied. Any element that is predicated
+ * with this condition will always be included.
+ *
+ * @return instance of the condition
+ */
+ static InclusionCondition alwaysInclude() {
+ return TypeCondition.JAVA_LANG_OBJECT_REACHED;
+ }
+
+ /**
+ * Creates the type-reached condition that is satisfied when the type is reached at runtime.
+ *
+ * @param type that has to be reached for this condition to be satisfied
+ * @return instance of the condition
+ */
+ static InclusionCondition typeReached(Class> type) {
+ return TypeCondition.create(type, true);
+ }
+}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/ReflectionDynamicAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/ReflectionDynamicAccess.java
new file mode 100644
index 000000000000..611f23997bac
--- /dev/null
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/ReflectionDynamicAccess.java
@@ -0,0 +1,57 @@
+package org.graalvm.nativeimage.hosted;
+
+import java.lang.reflect.Executable;
+import java.lang.reflect.Field;
+
+/**
+ * This class is used to register classes, methods, fields for reflection, serialization and JNI
+ * access at runtime.
+ *
+ * It should only be used at {@link Feature#afterRegistration}.
+ */
+public interface ReflectionDynamicAccess {
+
+ /**
+ * Makes the provided classes available for reflection at runtime, and all of their accessible
+ * members available for reflection queries at run time. A call to {@link Class#forName} for the
+ * names of the classes will return the classes at run time.
+ *
+ * @param condition needs to be satisfied for inclusion of types for reflection at runtime
+ */
+ void register(InclusionCondition condition, Class>... classes);
+
+ /**
+ * Makes the provided class available for reflection at runtime if {@code condition} is
+ * satisfied. A call to {@link Class#forName} for the name of the class will return the class
+ * (if it exists) or a {@link ClassNotFoundException} at run time.
+ */
+ void registerClassLookup(InclusionCondition condition, String className);
+
+ /**
+ * Makes the provided methods available for reflection at runtime if {@code condition} is
+ * satisfied. The methods will be returned by {@link Class#getMethod},
+ * {@link Class#getDeclaredMethod(String, Class[])}, and all the other methods on {@link Class}
+ * that return a single method. Methods can be invoked via reflection.
+ */
+ void register(InclusionCondition condition, Executable... methods);
+
+ /**
+ * Makes the provided fields available for reflection at runtime if {@code condition} is
+ * satisfied.The fields will be returned by {@link Class#getField},
+ * {@link Class#getDeclaredField(String)}, and all the other methods on {@link Class} that
+ * return a single field. Fields can be accessed via reflection
+ */
+ void register(InclusionCondition condition, Field... fields);
+
+ /**
+ * Makes the provided classes available for serialization and reflection at runtime if
+ * {@code condition} is satisfied.
+ */
+ void registerForSerialization(InclusionCondition condition, Class>... classes);
+
+ /**
+ * Makes the provided classes available for JNI access at runtime if {@code condition} is
+ * satisfied.
+ */
+ void registerForJNIAccess(InclusionCondition condition, Class>... classes);
+}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/ResourceDynamicAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/ResourceDynamicAccess.java
new file mode 100644
index 000000000000..6cf928be6beb
--- /dev/null
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/ResourceDynamicAccess.java
@@ -0,0 +1,33 @@
+package org.graalvm.nativeimage.hosted;
+
+/**
+ * This class is used to register Java resources and ResourceBundles that should be accessible at
+ * runtime.
+ */
+public interface ResourceDynamicAccess {
+
+ /**
+ * If {@code pattern} contains any wildcard patterns, such as star(*) or globstar(**), pattern
+ * is treated as glob pattern from {@code module} and will be registered if {@code condition} is
+ * satisfied. All resources that match the glob are available at runtime. Otherwise pattern
+ * represents Java resource from {@code module} that will be available at run time if
+ * {@code condition} is satisfied.
+ */
+ void register(InclusionCondition condition, Module module, String pattern);
+
+ default void register(InclusionCondition condition, String pattern) {
+ register(condition, null, pattern);
+ }
+
+ /**
+ * Make Java ResourceBundle that is specified by a {@code bundleName} from module {@code module}
+ * available at run time if {@code condition} is satisfied. If the given {@code module} is
+ * unnamed, the ResourceBundle is looked up on the classpath instead.
+ */
+ void registerResourceBundle(InclusionCondition condition, Module module, String bundleName);
+
+ default void registerResourceBundle(InclusionCondition condition, String bundleName) {
+ registerResourceBundle(condition, null, bundleName);
+ }
+
+}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java
index 2b5aa887f6ce..48dcc7c11c48 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -46,7 +46,6 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeForeignAccessSupport;
@Platforms(Platform.HOSTED_ONLY.class)
@@ -68,7 +67,7 @@ public final class RuntimeForeignAccess {
* @since 23.1
*/
public static void registerForDowncall(Object desc, Object... options) {
- ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDowncall(ConfigurationCondition.alwaysTrue(), desc, options);
+ ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDowncall(InclusionCondition.alwaysInclude(), desc, options);
}
/**
@@ -86,7 +85,7 @@ public static void registerForDowncall(Object desc, Object... options) {
* @since 24.1
*/
public static void registerForUpcall(Object desc, Object... options) {
- ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForUpcall(ConfigurationCondition.alwaysTrue(), desc, options);
+ ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForUpcall(InclusionCondition.alwaysInclude(), desc, options);
}
/**
@@ -114,7 +113,7 @@ public static void registerForUpcall(Object desc, Object... options) {
* @since 24.2
*/
public static void registerForDirectUpcall(MethodHandle target, Object desc, Object... options) {
- ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDirectUpcall(ConfigurationCondition.alwaysTrue(), target, desc, options);
+ ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDirectUpcall(InclusionCondition.alwaysInclude(), target, desc, options);
}
private RuntimeForeignAccess() {
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java
index e5c044517406..a9c2e4a3a090 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -46,7 +46,6 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport;
/**
@@ -66,7 +65,7 @@ public final class RuntimeJNIAccess {
* @since 22.3
*/
public static void register(Class>... classes) {
- ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), classes);
+ ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(InclusionCondition.alwaysInclude(), classes);
}
/**
@@ -79,7 +78,7 @@ public static void register(Class>... classes) {
* @since 22.3
*/
public static void register(Executable... methods) {
- ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), false, methods);
+ ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(InclusionCondition.alwaysInclude(), false, methods);
}
/**
@@ -92,7 +91,7 @@ public static void register(Executable... methods) {
* @since 22.3
*/
public static void register(Field... fields) {
- ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), false, fields);
+ ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(InclusionCondition.alwaysInclude(), false, fields);
}
private RuntimeJNIAccess() {
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java
index a2f4f7bb781e..d141b2af7399 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -43,7 +43,6 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
/**
@@ -62,7 +61,7 @@ public final class RuntimeProxyCreation {
* @since 22.3
*/
public static void register(Class>... interfaces) {
- ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(ConfigurationCondition.alwaysTrue(), interfaces);
+ ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(InclusionCondition.alwaysInclude(), interfaces);
}
private RuntimeProxyCreation() {
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java
index a4b5adb949f3..72316c14cfef 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java
@@ -48,7 +48,6 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeReflectionSupport;
//Checkstyle: allow reflection
@@ -69,7 +68,7 @@ public final class RuntimeReflection {
* @since 19.0
*/
public static void register(Class>... classes) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), classes);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).register(InclusionCondition.alwaysInclude(), classes);
}
/**
@@ -80,7 +79,7 @@ public static void register(Class>... classes) {
* @since 23.0
*/
public static void registerClassLookup(String className) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerClassLookup(ConfigurationCondition.alwaysTrue(), className);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerClassLookup(InclusionCondition.alwaysInclude(), className);
}
/**
@@ -91,7 +90,7 @@ public static void registerClassLookup(String className) {
* @since 19.0
*/
public static void register(Executable... methods) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), false, methods);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).register(InclusionCondition.alwaysInclude(), false, methods);
}
/**
@@ -103,7 +102,7 @@ public static void register(Executable... methods) {
* @since 21.3
*/
public static void registerAsQueried(Executable... methods) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), true, methods);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).register(InclusionCondition.alwaysInclude(), true, methods);
}
/**
@@ -116,7 +115,7 @@ public static void registerAsQueried(Executable... methods) {
* @since 23.0
*/
public static void registerMethodLookup(Class> declaringClass, String methodName, Class>... parameterTypes) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerMethodLookup(ConfigurationCondition.alwaysTrue(), declaringClass, methodName, parameterTypes);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerMethodLookup(InclusionCondition.alwaysInclude(), declaringClass, methodName, parameterTypes);
}
/**
@@ -130,7 +129,7 @@ public static void registerMethodLookup(Class> declaringClass, String methodNa
* @since 23.0
*/
public static void registerConstructorLookup(Class> declaringClass, Class>... parameterTypes) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerConstructorLookup(ConfigurationCondition.alwaysTrue(), declaringClass, parameterTypes);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerConstructorLookup(InclusionCondition.alwaysInclude(), declaringClass, parameterTypes);
}
/**
@@ -141,7 +140,7 @@ public static void registerConstructorLookup(Class> declaringClass, Class>..
* @since 19.0
*/
public static void register(Field... fields) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), false, fields);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).register(InclusionCondition.alwaysInclude(), false, fields);
}
/**
@@ -153,7 +152,7 @@ public static void register(Field... fields) {
* @since 19.0
*/
public static void registerFieldLookup(Class> declaringClass, String fieldName) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerFieldLookup(ConfigurationCondition.alwaysTrue(), declaringClass, fieldName);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerFieldLookup(InclusionCondition.alwaysInclude(), declaringClass, fieldName);
}
/**
@@ -162,7 +161,7 @@ public static void registerFieldLookup(Class> declaringClass, String fieldName
* @since 23.0
*/
public static void registerAllClasses(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllClassesQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllClassesQuery(InclusionCondition.alwaysInclude(), declaringClass);
}
/**
@@ -171,7 +170,7 @@ public static void registerAllClasses(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllDeclaredClasses(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredClassesQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredClassesQuery(InclusionCondition.alwaysInclude(), declaringClass);
}
/**
@@ -181,7 +180,7 @@ public static void registerAllDeclaredClasses(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllMethods(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllMethodsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllMethodsQuery(InclusionCondition.alwaysInclude(), true, declaringClass);
}
/**
@@ -191,7 +190,7 @@ public static void registerAllMethods(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllDeclaredMethods(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredMethodsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredMethodsQuery(InclusionCondition.alwaysInclude(), true, declaringClass);
}
/**
@@ -201,7 +200,7 @@ public static void registerAllDeclaredMethods(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllConstructors(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllConstructorsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllConstructorsQuery(InclusionCondition.alwaysInclude(), true, declaringClass);
}
/**
@@ -211,7 +210,7 @@ public static void registerAllConstructors(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllDeclaredConstructors(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredConstructorsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredConstructorsQuery(InclusionCondition.alwaysInclude(), true, declaringClass);
}
/**
@@ -221,7 +220,7 @@ public static void registerAllDeclaredConstructors(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllFields(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllFields(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllFields(InclusionCondition.alwaysInclude(), declaringClass);
}
/**
@@ -231,7 +230,7 @@ public static void registerAllFields(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllDeclaredFields(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredFields(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredFields(InclusionCondition.alwaysInclude(), declaringClass);
}
/**
@@ -240,7 +239,7 @@ public static void registerAllDeclaredFields(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllNestMembers(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllNestMembersQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllNestMembersQuery(InclusionCondition.alwaysInclude(), declaringClass);
}
/**
@@ -249,7 +248,7 @@ public static void registerAllNestMembers(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllPermittedSubclasses(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllPermittedSubclassesQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllPermittedSubclassesQuery(InclusionCondition.alwaysInclude(), declaringClass);
}
/**
@@ -258,7 +257,7 @@ public static void registerAllPermittedSubclasses(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllRecordComponents(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllRecordComponentsQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllRecordComponentsQuery(InclusionCondition.alwaysInclude(), declaringClass);
}
/**
@@ -267,7 +266,7 @@ public static void registerAllRecordComponents(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllSigners(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllSignersQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllSignersQuery(InclusionCondition.alwaysInclude(), declaringClass);
}
/**
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java
index 6d7b6cd60398..c55cab1d968c 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -47,7 +47,6 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
/**
@@ -84,7 +83,7 @@ public static void addResource(Module module, String resourcePath, byte[] resour
Objects.requireNonNull(resourcePath);
Objects.requireNonNull(resourceContent);
ImageSingletons.lookup(RuntimeResourceSupport.class).injectResource(module, resourcePath, resourceContent, "Manually added via RuntimeResourceAccess");
- ImageSingletons.lookup(RuntimeResourceSupport.class).addCondition(ConfigurationCondition.alwaysTrue(), module, resourcePath);
+ ImageSingletons.lookup(RuntimeResourceSupport.class).addCondition(InclusionCondition.alwaysInclude(), module, resourcePath);
}
/**
@@ -96,7 +95,7 @@ public static void addResource(Module module, String resourcePath, byte[] resour
*/
public static void addResourceBundle(Module module, String baseBundleName, Locale[] locales) {
Objects.requireNonNull(locales);
- RuntimeResourceSupport.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(),
+ RuntimeResourceSupport.singleton().addResourceBundles(InclusionCondition.alwaysInclude(),
withModuleName(module, baseBundleName), Arrays.asList(locales));
}
@@ -108,7 +107,7 @@ public static void addResourceBundle(Module module, String baseBundleName, Local
* @since 22.3
*/
public static void addResourceBundle(Module module, String bundleName) {
- RuntimeResourceSupport.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(),
+ RuntimeResourceSupport.singleton().addResourceBundles(InclusionCondition.alwaysInclude(),
withModuleName(module, bundleName));
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java
index 8de8de2ea716..7b1d506ca951 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -42,7 +42,6 @@
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeSerializationSupport;
/**
@@ -72,7 +71,7 @@ public final class RuntimeSerialization {
* @since 21.3
*/
public static void registerIncludingAssociatedClasses(Class> clazz) {
- RuntimeSerializationSupport.singleton().registerIncludingAssociatedClasses(ConfigurationCondition.alwaysTrue(), clazz);
+ RuntimeSerializationSupport.singleton().registerIncludingAssociatedClasses(InclusionCondition.alwaysInclude(), clazz);
}
/**
@@ -82,7 +81,7 @@ public static void registerIncludingAssociatedClasses(Class> clazz) {
*/
public static void register(Class>... classes) {
for (Class> clazz : classes) {
- RuntimeSerializationSupport.singleton().register(ConfigurationCondition.alwaysTrue(), clazz);
+ RuntimeSerializationSupport.singleton().register(InclusionCondition.alwaysInclude(), clazz);
}
}
@@ -103,7 +102,7 @@ public static void register(Class>... classes) {
@Deprecated(since = "24.2")
@SuppressWarnings("unused")
public static void registerWithTargetConstructorClass(Class> clazz, Class> customTargetConstructorClazz) {
- RuntimeSerializationSupport.singleton().register(ConfigurationCondition.alwaysTrue(), clazz);
+ RuntimeSerializationSupport.singleton().register(InclusionCondition.alwaysInclude(), clazz);
}
/**
@@ -114,7 +113,7 @@ public static void registerWithTargetConstructorClass(Class> clazz, Class> c
* @since 22.3
*/
public static void registerLambdaCapturingClass(Class> lambdaCapturingClass) {
- RuntimeSerializationSupport.singleton().registerLambdaCapturingClass(ConfigurationCondition.alwaysTrue(), lambdaCapturingClass);
+ RuntimeSerializationSupport.singleton().registerLambdaCapturingClass(InclusionCondition.alwaysInclude(), lambdaCapturingClass);
}
/**
@@ -125,7 +124,7 @@ public static void registerLambdaCapturingClass(Class> lambdaCapturingClass) {
* @since 22.3
*/
public static void registerProxyClass(Class>... implementedInterfaces) {
- RuntimeSerializationSupport.singleton().registerProxyClass(ConfigurationCondition.alwaysTrue(), implementedInterfaces);
+ RuntimeSerializationSupport.singleton().registerProxyClass(InclusionCondition.alwaysInclude(), implementedInterfaces);
}
private RuntimeSerialization() {
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java
index 9d0534347cfb..ca5515207991 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -44,22 +44,24 @@
import java.lang.reflect.Field;
import java.util.Arrays;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
+
public interface ReflectionRegistry {
- default void register(ConfigurationCondition condition, Class>... classes) {
+ default void register(InclusionCondition condition, Class>... classes) {
Arrays.stream(classes).forEach(clazz -> register(condition, false, clazz));
}
- void register(ConfigurationCondition condition, boolean unsafeAllocated, Class> clazz);
+ void register(InclusionCondition condition, boolean unsafeAllocated, Class> clazz);
- void register(ConfigurationCondition condition, boolean queriedOnly, Executable... methods);
+ void register(InclusionCondition condition, boolean queriedOnly, Executable... methods);
- void register(ConfigurationCondition condition, boolean finalIsWritable, Field... fields);
+ void register(InclusionCondition condition, boolean finalIsWritable, Field... fields);
- void registerClassLookup(ConfigurationCondition condition, String typeName);
+ void registerClassLookup(InclusionCondition condition, String typeName);
- void registerFieldLookup(ConfigurationCondition condition, Class> declaringClass, String fieldName);
+ void registerFieldLookup(InclusionCondition condition, Class> declaringClass, String fieldName);
- void registerMethodLookup(ConfigurationCondition condition, Class> declaringClass, String methodName, Class>... parameterTypes);
+ void registerMethodLookup(InclusionCondition condition, Class> declaringClass, String methodName, Class>... parameterTypes);
- void registerConstructorLookup(ConfigurationCondition condition, Class> declaringClass, Class>... parameterTypes);
+ void registerConstructorLookup(InclusionCondition condition, Class> declaringClass, Class>... parameterTypes);
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java
index dd0537c496fc..28e1a879ebe9 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -42,10 +42,12 @@
import java.lang.invoke.MethodHandle;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
+
public interface RuntimeForeignAccessSupport {
- void registerForDowncall(ConfigurationCondition condition, Object desc, Object... options);
+ void registerForDowncall(InclusionCondition condition, Object desc, Object... options);
- void registerForUpcall(ConfigurationCondition condition, Object desc, Object... options);
+ void registerForUpcall(InclusionCondition condition, Object desc, Object... options);
- void registerForDirectUpcall(ConfigurationCondition condition, MethodHandle target, Object desc, Object... options);
+ void registerForDirectUpcall(InclusionCondition condition, MethodHandle target, Object desc, Object... options);
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java
index f7ca149c3c3f..1eb506f9ff2a 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -40,6 +40,8 @@
*/
package org.graalvm.nativeimage.impl;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
+
public interface RuntimeProxyCreationSupport {
- void addProxyClass(ConfigurationCondition condition, Class>... interfaces);
+ void addProxyClass(InclusionCondition condition, Class>... interfaces);
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java
index 8d1d11c169e3..a0f2459868d7 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java
@@ -44,38 +44,43 @@
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
import org.graalvm.nativeimage.hosted.RuntimeJNIAccess;
import org.graalvm.nativeimage.hosted.RuntimeProxyCreation;
public interface RuntimeReflectionSupport extends ReflectionRegistry {
// needed as reflection-specific ImageSingletons key
- void registerAllMethodsQuery(ConfigurationCondition condition, boolean queriedOnly, Class> clazz);
+ void registerAllMethodsQuery(InclusionCondition condition, boolean queriedOnly, Class> clazz);
- void registerAllDeclaredMethodsQuery(ConfigurationCondition condition, boolean queriedOnly, Class> clazz);
+ void registerAllDeclaredMethodsQuery(InclusionCondition condition, boolean queriedOnly, Class> clazz);
- void registerAllFields(ConfigurationCondition condition, Class> clazz);
+ void registerAllFields(InclusionCondition condition, Class> clazz);
- void registerAllDeclaredFields(ConfigurationCondition condition, Class> clazz);
+ void registerAllFieldsQuery(InclusionCondition condition, boolean queriedOnly, Class> clazz);
- void registerAllConstructorsQuery(ConfigurationCondition condition, boolean queriedOnly, Class> clazz);
+ void registerAllDeclaredFields(InclusionCondition condition, Class> clazz);
- void registerAllDeclaredConstructorsQuery(ConfigurationCondition condition, boolean queriedOnly, Class> clazz);
+ void registerAllDeclaredFieldsQuery(InclusionCondition condition, boolean queriedOnly, Class> clazz);
- void registerAllClassesQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllConstructorsQuery(InclusionCondition condition, boolean queriedOnly, Class> clazz);
- void registerAllDeclaredClassesQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllDeclaredConstructorsQuery(InclusionCondition condition, boolean queriedOnly, Class> clazz);
- void registerAllRecordComponentsQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllClassesQuery(InclusionCondition condition, Class> clazz);
- void registerAllPermittedSubclassesQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllDeclaredClassesQuery(InclusionCondition condition, Class> clazz);
- void registerAllNestMembersQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllRecordComponentsQuery(InclusionCondition condition, Class> clazz);
- void registerAllSignersQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllPermittedSubclassesQuery(InclusionCondition condition, Class> clazz);
- void registerClassLookupException(ConfigurationCondition condition, String typeName, Throwable t);
+ void registerAllNestMembersQuery(InclusionCondition condition, Class> clazz);
- default void registerClassFully(ConfigurationCondition condition, Class> clazz) {
+ void registerAllSignersQuery(InclusionCondition condition, Class> clazz);
+
+ void registerClassLookupException(InclusionCondition condition, String typeName, Throwable t);
+
+ default void registerClassFully(InclusionCondition condition, Class> clazz) {
register(condition, false, clazz);
// GR-62143 Register all fields is very slow.
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java
index f0c2273cbf95..c51570a08924 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -44,11 +44,12 @@
import java.util.Locale;
import org.graalvm.nativeimage.ImageSingletons;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
public interface RuntimeResourceSupport {
@SuppressWarnings("unchecked")
- static RuntimeResourceSupport singleton() {
+ static RuntimeResourceSupport singleton() {
return ImageSingletons.lookup(RuntimeResourceSupport.class);
}
@@ -63,15 +64,15 @@ static RuntimeResourceSupport singleton() {
void addResourceBundles(C condition, String basename, Collection locales);
/* Following functions are used only from features */
- void addCondition(ConfigurationCondition configurationCondition, Module module, String resourcePath);
+ void addCondition(InclusionCondition metadataCondition1, Module module, String resourcePath);
void addResourceEntry(Module module, String resourcePath, Object origin);
default void addResource(Module module, String resourcePath, Object origin) {
- addResource(ConfigurationCondition.alwaysTrue(), module, resourcePath, origin);
+ addResource(InclusionCondition.alwaysInclude(), module, resourcePath, origin);
}
- default void addResource(ConfigurationCondition condition, Module module, String resourcePath, Object origin) {
+ default void addResource(InclusionCondition condition, Module module, String resourcePath, Object origin) {
addResourceEntry(module, resourcePath, origin);
addCondition(condition, module, resourcePath);
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java
index 3237047e86d8..81cb4eaae0e7 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -45,16 +45,21 @@
import java.util.stream.Collectors;
import org.graalvm.nativeimage.ImageSingletons;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
public interface RuntimeSerializationSupport {
@SuppressWarnings("unchecked")
- static RuntimeSerializationSupport singleton() {
+ static RuntimeSerializationSupport singleton() {
return ImageSingletons.lookup(RuntimeSerializationSupport.class);
}
void registerIncludingAssociatedClasses(C condition, Class> clazz);
+ default void register(C condition, Class>... classes) {
+ Arrays.stream(classes).forEach(clazz -> register(condition, clazz));
+ }
+
void register(C condition, Class> clazz);
void register(C condition, String clazz);
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ConfigurationCondition.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/TypeCondition.java
similarity index 63%
rename from sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ConfigurationCondition.java
rename to sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/TypeCondition.java
index d7c56dc0dd98..9ac5fcc25201 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ConfigurationCondition.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/TypeCondition.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -42,44 +42,20 @@
import java.util.Objects;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
+
/**
- * A condition that describes if a reflectively-accessed element in Native Image is visible by the
- * user at run time.
- *
- * Currently, there is only two types of condition:
- *
typeReached (the default) that signifies that the type must be both reachable by
- * static analysis at build time, and reached at run time. A type is reached at run time, right
- * before the class-initialization routine starts for that type, or any of the type's subtypes are
- * reached.
- *
typeReachable (legacy) that signifies that the type must be reachable by static
- * analysis at build time.
- *
- * When {@link ConfigurationCondition#runtimeChecked} is true denotes that this is a
+ * Type that represents both type-reached and type-reachable condition. When
+ * {@link TypeCondition#runtimeChecked} is true denotes that this is a
* typeReached condition.
*/
-public final class ConfigurationCondition {
+public class TypeCondition implements InclusionCondition {
/* Cached to save space: it is used as a marker for all non-conditional elements */
- private static final ConfigurationCondition JAVA_LANG_OBJECT_REACHED = new ConfigurationCondition(Object.class, true);
-
- public static ConfigurationCondition alwaysTrue() {
- return JAVA_LANG_OBJECT_REACHED;
- }
-
+ public static final TypeCondition JAVA_LANG_OBJECT_REACHED = new TypeCondition(Object.class, true);
private final Class> type;
- private final boolean runtimeChecked;
-
- /**
- * Creates the default type-reached condition that is satisfied when the type is reached at
- * runtime.
- *
- * @param type that has to be reached for this condition to be satisfied
- * @return instance of the condition
- */
- public static ConfigurationCondition create(Class> type) {
- return create(type, true);
- }
+ final boolean runtimeChecked;
/**
* Creates either a type-reached condition ({@code runtimeChecked = true}) or a type-reachable
@@ -89,31 +65,28 @@ public static ConfigurationCondition create(Class> type) {
* @param runtimeChecked makes this a type-reachable condition when false
* @return instance of the condition
*/
- public static ConfigurationCondition create(Class> type, boolean runtimeChecked) {
+
+ public static TypeCondition create(Class> type, boolean runtimeChecked) {
Objects.requireNonNull(type);
- if (JAVA_LANG_OBJECT_REACHED.getType().equals(type)) {
- return JAVA_LANG_OBJECT_REACHED;
+ if (TypeCondition.JAVA_LANG_OBJECT_REACHED.getKey().equals(type)) {
+ return TypeCondition.JAVA_LANG_OBJECT_REACHED;
}
- return new ConfigurationCondition(type, runtimeChecked);
+ return new TypeCondition(type, runtimeChecked);
}
public boolean isAlwaysTrue() {
- return ConfigurationCondition.alwaysTrue().equals(this);
+ return InclusionCondition.alwaysInclude().equals(this);
}
- private ConfigurationCondition(Class> type, boolean runtimeChecked) {
+ public TypeCondition(Class> type, boolean runtimeChecked) {
this.runtimeChecked = runtimeChecked;
this.type = type;
}
- public Class> getType() {
+ public Class> getKey() {
return type;
}
- public boolean isRuntimeChecked() {
- return runtimeChecked;
- }
-
@Override
public boolean equals(Object o) {
if (this == o) {
@@ -122,7 +95,7 @@ public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
- ConfigurationCondition that = (ConfigurationCondition) o;
+ TypeCondition that = (TypeCondition) o;
return runtimeChecked == that.runtimeChecked && Objects.equals(type, that.type);
}
@@ -138,4 +111,8 @@ public String toString() {
", runtimeChecked=" + runtimeChecked +
')';
}
+
+ public boolean isRuntimeChecked() {
+ return runtimeChecked;
+ }
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java
index fb7a182cda99..509f1115c172 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -42,9 +42,11 @@
import java.util.Objects;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
+
/**
- * Represents a {@link ConfigurationCondition} during parsing before it is resolved in a context of
- * the classpath.
+ * Represents a {@link InclusionCondition} during parsing before it is resolved in a context of the
+ * classpath.
*/
public final class UnresolvedConfigurationCondition implements Comparable {
private static final UnresolvedConfigurationCondition JAVA_LANG_OBJECT_REACHED = new UnresolvedConfigurationCondition(Object.class.getTypeName(), true);
diff --git a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java
index 7af57c99b3f6..76626d9474fe 100644
--- a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java
+++ b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java
@@ -34,7 +34,7 @@
import java.util.List;
import java.util.Locale;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition;
import org.junit.Assert;
import org.junit.Test;
@@ -127,7 +127,7 @@ public void addResourceBundles(UnresolvedConfigurationCondition condition, Strin
}
@Override
- public void addCondition(ConfigurationCondition configurationCondition, Module module, String resourcePath) {
+ public void addCondition(InclusionCondition configurationCondition, Module module, String resourcePath) {
}
diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java
index 5fbdb3418524..4bb812187298 100644
--- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java
+++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java
@@ -28,13 +28,13 @@
import java.util.Locale;
import org.graalvm.nativeimage.ImageSingletons;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
public interface ResourcesRegistry extends RuntimeResourceSupport {
@SuppressWarnings("unchecked")
- static ResourcesRegistry singleton() {
+ static ResourcesRegistry singleton() {
return ImageSingletons.lookup(ResourcesRegistry.class);
}
diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java
index 61c884918041..e549c54226ee 100644
--- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java
+++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java
@@ -40,7 +40,7 @@
import java.util.concurrent.ConcurrentMap;
import java.util.regex.Pattern;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition;
import com.oracle.svm.configure.ConditionalElement;
@@ -82,7 +82,7 @@ public void addResourceEntry(Module module, String resourcePath, Object origin)
}
@Override
- public void addCondition(ConfigurationCondition condition, Module module, String resourcePath) {
+ public void addCondition(InclusionCondition condition, Module module, String resourcePath) {
throw new UnsupportedOperationException("Unused function.");
}
diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java
index 3f3a411b3a13..1bd93786ae24 100644
--- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java
+++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java
@@ -34,7 +34,7 @@
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
@Platforms(Platform.HOSTED_ONLY.class)
public abstract class ClassLoaderSupport {
@@ -52,7 +52,7 @@ public boolean isNativeImageClassLoader(ClassLoader classLoader) {
protected abstract boolean isNativeImageClassLoaderImpl(ClassLoader classLoader);
- public record ConditionWithOrigin(ConfigurationCondition condition, Object origin) {
+ public record ConditionWithOrigin(InclusionCondition condition, Object origin) {
}
public interface ResourceCollector {
@@ -60,7 +60,7 @@ public interface ResourceCollector {
void addResourceEntry(Module module, String resourceName, Object origin);
- void addResourceConditionally(Module module, String resourceName, ConfigurationCondition condition, Object origin);
+ void addResourceConditionally(Module module, String resourceName, InclusionCondition condition, Object origin);
void registerNegativeQuery(Module module, String resourceName);
diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java
index d403da2152bc..917e005ee97c 100644
--- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java
+++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java
@@ -33,7 +33,8 @@
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
+import org.graalvm.nativeimage.impl.TypeCondition;
import com.oracle.svm.core.hub.DynamicHub;
import com.oracle.svm.core.util.VMError;
@@ -44,7 +45,7 @@
*
* If any of the {@link #conditions} is satisfied then the whole set becomes also
* {@link #satisfied}. {@link RuntimeConditionSet}s can be created at build time
- * {@link #createHosted(ConfigurationCondition)} and stored to the image heap, or it can be encoded
+ * {@link #createHosted(InclusionCondition)} and stored to the image heap, or it can be encoded
* ({@link #getTypesForEncoding()} and later decoded at run time ({@link #createDecoded(Object[])}.
* The current implementation does not cache {@link #conditions}, although this will be implemented
* in the future (GR-49526)
@@ -60,18 +61,18 @@ public static RuntimeConditionSet emptySet() {
}
@Platforms(Platform.HOSTED_ONLY.class)
- public static RuntimeConditionSet createHosted(ConfigurationCondition condition) {
+ public static RuntimeConditionSet createHosted(InclusionCondition condition) {
var conditionSet = new RuntimeConditionSet(new Object[0]);
conditionSet.addCondition(condition);
return conditionSet;
}
@Platforms(Platform.HOSTED_ONLY.class)
- public synchronized void addCondition(ConfigurationCondition cnd) {
- VMError.guarantee(cnd.isRuntimeChecked(), "Only runtime conditions can be added to the ConditionalRuntimeValue.");
+ public synchronized void addCondition(InclusionCondition cnd) {
+ VMError.guarantee(((TypeCondition) cnd).isRuntimeChecked(), "Only runtime conditions can be added to the ConditionalRuntimeValue.");
if (satisfied) {
return;
- } else if (cnd.isAlwaysTrue()) {
+ } else if (((TypeCondition) cnd).isAlwaysTrue()) {
conditions = null;
satisfied = true;
return;
@@ -159,11 +160,11 @@ private void setConditions(Object[] conditions) {
satisfied = false;
}
- private static Object createRuntimeCondition(ConfigurationCondition cnd) {
- if (cnd.isAlwaysTrue() || !cnd.isRuntimeChecked()) {
+ private static Object createRuntimeCondition(InclusionCondition cnd) {
+ if (((TypeCondition) cnd).isAlwaysTrue() || !((TypeCondition) cnd).isRuntimeChecked()) {
throw VMError.shouldNotReachHere("We should never create run-time conditions from conditions that are always true at build time. Condition: " + cnd);
}
- return cnd.getType();
+ return ((TypeCondition) cnd).getKey();
}
private static boolean isSatisfied(Object condition) {
@@ -190,7 +191,7 @@ private UnmodifiableRuntimeConditionSet(Object[] conditions) {
}
@Override
- public synchronized void addCondition(ConfigurationCondition cnd) {
+ public synchronized void addCondition(InclusionCondition cnd) {
throw new UnsupportedOperationException("Can't add conditions to an unmodifiable set of conditions.");
}
}
diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java
index a7818355e12e..97cea27de0ee 100644
--- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java
+++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java
@@ -29,12 +29,15 @@
import java.lang.reflect.Modifier;
import java.util.EnumSet;
import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
import org.graalvm.collections.EconomicMap;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platform.HOSTED_ONLY;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.InclusionCondition;
import com.oracle.svm.core.configure.ConditionalRuntimeValue;
import com.oracle.svm.core.configure.RuntimeConditionSet;
@@ -78,11 +81,11 @@ private static ClassForNameSupport[] layeredSingletons() {
@Platforms(Platform.HOSTED_ONLY.class)
public void registerClass(Class> clazz) {
- registerClass(ConfigurationCondition.alwaysTrue(), clazz);
+ registerClass(InclusionCondition.alwaysInclude(), clazz);
}
@Platforms(Platform.HOSTED_ONLY.class)
- public void registerClass(ConfigurationCondition condition, Class> clazz) {
+ public void registerClass(InclusionCondition condition, Class> clazz) {
assert !clazz.isPrimitive() : "primitive classes cannot be looked up by name";
if (PredefinedClassesSupport.isPredefined(clazz)) {
return; // must be defined at runtime before it can be looked up
@@ -134,7 +137,7 @@ private boolean isLibGraalClass(Class> clazz) {
}
public static ConditionalRuntimeValue