This is an automated email from the ASF dual-hosted git repository.

mattsicker pushed a commit to branch feature/3.x/name-alias-provider
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 579716c3b8b604d6afe8e9edfa6c9da0e3cf66f0
Author: Matt Sicker <[email protected]>
AuthorDate: Thu Aug 7 17:14:05 2025 -0500

    Remove protected Key constructor
---
 .../validators/ValidHostValidatorTest.java         |  4 +--
 .../validators/ValidPortValidatorTest.java         |  4 +--
 .../logging/log4j/core/ContextDataInjector.java    |  2 +-
 .../java/org/apache/logging/log4j/core/Core.java   |  4 +--
 .../action/CompressActionFactoryProvider.java      |  8 ++++++
 .../CompositeCompressActionFactoryProvider.java    |  4 +--
 .../log4j/core/config/AbstractConfiguration.java   |  4 ++-
 .../logging/log4j/core/config/Configuration.java   |  2 +-
 .../log4j/core/config/ConfigurationFactory.java    |  6 ++--
 .../log4j/core/config/composite/MergeStrategy.java |  2 +-
 .../logging/log4j/core/impl/LogEventFactory.java   |  2 +-
 .../logging/log4j/core/lookup/StrLookup.java       |  4 +--
 .../logging/log4j/core/script/ScriptManager.java   |  2 +-
 .../log4j/core/selector/ContextSelector.java       |  2 +-
 .../org/apache/logging/log4j/core/time/Clock.java  |  2 +-
 .../apache/logging/log4j/core/time/NanoClock.java  |  2 +-
 .../layout/template/json/JsonTemplateLayout.java   |  7 ++---
 .../json/resolver/EventResolverFactory.java        | 11 +++++++-
 .../json/resolver/EventResolverInterceptor.java    | 10 ++++++-
 .../di/ConfigurableInstanceFactoryTest.java        | 13 +++++++--
 .../apache/logging/log4j/plugins/di/KeysTest.java  |  6 ----
 .../org/apache/logging/log4j/plugins/Node.java     |  3 +-
 .../org/apache/logging/log4j/plugins/di/Key.java   | 25 ----------------
 .../log4j/plugins/di/spi/InjectionPoint.java       |  2 +-
 .../log4j/plugins/di/spi/StringValueResolver.java  |  2 +-
 .../logging/log4j/plugins/util/TypeUtil.java       | 33 ++++++++++++++++++++++
 26 files changed, 99 insertions(+), 67 deletions(-)

diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java
index 256f3aaf7d..86aaab96de 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java
@@ -21,7 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.logging.log4j.core.config.ConfigurationProcessor;
-import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.di.ConfigurableInstanceFactory;
 import org.apache.logging.log4j.plugins.di.DI;
@@ -42,7 +41,8 @@ public class ValidHostValidatorTest {
 
     @BeforeEach
     public void setUp() throws Exception {
-        final PluginNamespace category = instanceFactory.getInstance(new 
@Namespace("Test") Key<>() {});
+        final var key = 
Key.builder(PluginNamespace.class).setNamespace("Test").get();
+        final PluginNamespace category = instanceFactory.getInstance(key);
         PluginType<?> plugin = category.get("HostAndPort");
         assertNotNull(plugin, "Rebuild this module to ensure annotation 
processing has been done.");
         node = new Node(null, "HostAndPort", plugin);
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java
index 56b65dc422..e80f036fb7 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java
@@ -20,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
 import org.apache.logging.log4j.core.config.ConfigurationProcessor;
-import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.di.ConfigurableInstanceFactory;
 import org.apache.logging.log4j.plugins.di.DI;
@@ -39,7 +38,8 @@ public class ValidPortValidatorTest {
 
     @BeforeEach
     public void setUp() throws Exception {
-        final PluginNamespace category = instanceFactory.getInstance(new 
@Namespace("Test") Key<>() {});
+        final var key = 
Key.builder(PluginNamespace.class).setNamespace("Test").get();
+        final PluginNamespace category = instanceFactory.getInstance(key);
         final PluginType<?> plugin = category.get("HostAndPort");
         assertNotNull(plugin, "Rebuild this module to ensure annotation 
processing has been done.");
         node = new Node(null, "HostAndPort", plugin);
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java
index bc1a28100f..33160f88fb 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/ContextDataInjector.java
@@ -55,7 +55,7 @@ import org.apache.logging.log4j.util.StringMap;
  * @since 2.7
  */
 public interface ContextDataInjector {
-    Key<ContextDataInjector> KEY = new Key<>() {};
+    Key<ContextDataInjector> KEY = 
Key.builder(ContextDataInjector.class).get();
 
     /**
      * Returns a {@code StringMap} object initialized with the specified 
properties and the appropriate
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/Core.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/Core.java
index 850257f7f1..a1602b088c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Core.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Core.java
@@ -16,7 +16,6 @@
  */
 package org.apache.logging.log4j.core;
 
-import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.plugins.model.PluginNamespace;
@@ -26,5 +25,6 @@ public class Core {
     @Deprecated
     public static final String CATEGORY_NAME = Node.CORE_NAMESPACE;
 
-    public static final Key<PluginNamespace> PLUGIN_NAMESPACE_KEY = new 
@Namespace(Node.CORE_NAMESPACE) Key<>() {};
+    public static final Key<PluginNamespace> PLUGIN_NAMESPACE_KEY =
+            
Key.builder(PluginNamespace.class).setNamespace(Node.CORE_NAMESPACE).get();
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CompressActionFactoryProvider.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CompressActionFactoryProvider.java
index d8118b586c..cceb860d85 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CompressActionFactoryProvider.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/CompressActionFactoryProvider.java
@@ -16,8 +16,11 @@
  */
 package org.apache.logging.log4j.core.appender.rolling.action;
 
+import java.util.List;
 import 
org.apache.logging.log4j.core.appender.rolling.action.internal.CompositeCompressActionFactoryProvider;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.plugins.di.Key;
+import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.jspecify.annotations.NullMarked;
 import org.jspecify.annotations.Nullable;
 
@@ -31,6 +34,11 @@ public interface CompressActionFactoryProvider {
 
     String NAMESPACE = "compress";
 
+    Key<List<CompressActionFactoryProvider>> KEY = 
Key.<List<CompressActionFactoryProvider>>builder(
+                    TypeUtil.createParameterizedType(List.class, 
CompressActionFactoryProvider.class))
+            .setNamespace(NAMESPACE)
+            .get();
+
     /**
      * Creates the appropriate {@link CompressActionFactory} for the given 
compression algorithm.
      * <p>
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/internal/CompositeCompressActionFactoryProvider.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/internal/CompositeCompressActionFactoryProvider.java
index ec4e758906..0e65803816 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/internal/CompositeCompressActionFactoryProvider.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/internal/CompositeCompressActionFactoryProvider.java
@@ -21,8 +21,6 @@ import java.util.Objects;
 import 
org.apache.logging.log4j.core.appender.rolling.action.CompressActionFactory;
 import 
org.apache.logging.log4j.core.appender.rolling.action.CompressActionFactoryProvider;
 import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.plugins.Namespace;
-import org.apache.logging.log4j.plugins.di.Key;
 import org.jspecify.annotations.NullMarked;
 import org.jspecify.annotations.Nullable;
 
@@ -33,7 +31,7 @@ public class CompositeCompressActionFactoryProvider 
implements CompressActionFac
 
     public CompositeCompressActionFactoryProvider(final @Nullable 
Configuration configuration) {
         if (configuration != null) {
-            delegates = configuration.getComponent(new 
@Namespace(CompressActionFactoryProvider.NAMESPACE) Key<>() {});
+            delegates = 
configuration.getComponent(CompressActionFactoryProvider.KEY);
         } else {
             delegates = List.of(new JreCompressActionFactoryProvider());
         }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index 4c332e5239..d89585f43b 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -279,7 +279,9 @@ public abstract class AbstractConfiguration extends 
AbstractFilterable implement
         initializeScriptManager();
         // TODO(ms): this should use injectMembers()
         corePlugins = instanceFactory.getInstance(Core.PLUGIN_NAMESPACE_KEY);
-        final PluginNamespace levelPlugins = instanceFactory.getInstance(new 
@Namespace(Level.CATEGORY) Key<>() {});
+        final var levelPluginsKey =
+                
Key.builder(PluginNamespace.class).setNamespace(Level.CATEGORY).get();
+        final PluginNamespace levelPlugins = 
instanceFactory.getInstance(levelPluginsKey);
         levelPlugins.forEach(type -> {
             final Class<?> pluginClass = type.getPluginClass();
             try {
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
index b00280d4f3..f996f784f1 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
@@ -51,7 +51,7 @@ import org.apache.logging.log4j.plugins.di.Key;
 public interface Configuration extends Filterable {
 
     /** Injection key for the current Configuration. */
-    Key<Configuration> KEY = new Key<>() {};
+    Key<Configuration> KEY = Key.forClass(Configuration.class);
 
     /** Key for storing the Context properties. */
     String CONTEXT_PROPERTIES = "ContextProperties";
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
index f9713667ff..25ab99e079 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
@@ -24,7 +24,6 @@ import 
org.apache.logging.log4j.core.impl.CoreProperties.AuthenticationPropertie
 import org.apache.logging.log4j.core.util.AuthorizationProvider;
 import org.apache.logging.log4j.kit.env.PropertyEnvironment;
 import 
org.apache.logging.log4j.kit.env.internal.PropertiesUtilPropertyEnvironment;
-import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.di.ConfigurableInstanceFactory;
 import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.plugins.model.PluginNamespace;
@@ -62,9 +61,10 @@ public abstract class ConfigurationFactory extends 
ConfigurationBuilderFactory i
      */
     public static final String NAMESPACE = "ConfigurationFactory";
 
-    public static final Key<ConfigurationFactory> KEY = new Key<>() {};
+    public static final Key<ConfigurationFactory> KEY = 
Key.forClass(ConfigurationFactory.class);
 
-    public static final Key<PluginNamespace> PLUGIN_NAMESPACE_KEY = new 
@Namespace(NAMESPACE) Key<>() {};
+    public static final Key<PluginNamespace> PLUGIN_NAMESPACE_KEY =
+            Key.builder(PluginNamespace.class).setNamespace(NAMESPACE).get();
 
     /**
      * Allows subclasses access to the status logger without creating another 
instance.
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java
index 85becc2480..b0642b5fc9 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java
@@ -26,7 +26,7 @@ import org.apache.logging.log4j.plugins.model.PluginNamespace;
  */
 public interface MergeStrategy {
 
-    Key<MergeStrategy> KEY = new Key<>() {};
+    Key<MergeStrategy> KEY = Key.forClass(MergeStrategy.class);
 
     /**
      * Merge the root node properties into the configuration.
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
index 310e4d4c39..4a83005f57 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
@@ -28,7 +28,7 @@ import org.apache.logging.log4j.plugins.di.Key;
  *
  */
 public interface LogEventFactory {
-    Key<LogEventFactory> KEY = new Key<>() {};
+    Key<LogEventFactory> KEY = Key.forClass(LogEventFactory.class);
 
     LogEvent createEvent(
             String loggerName,
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java
index 45f27f1967..108df3b5c2 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java
@@ -17,7 +17,6 @@
 package org.apache.logging.log4j.core.lookup;
 
 import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.plugins.model.PluginNamespace;
 
@@ -42,7 +41,8 @@ public interface StrLookup {
      */
     String CATEGORY = "Lookup";
 
-    Key<PluginNamespace> PLUGIN_CATEGORY_KEY = new @Namespace(CATEGORY) 
Key<>() {};
+    Key<PluginNamespace> PLUGIN_CATEGORY_KEY =
+            Key.builder(PluginNamespace.class).setNamespace(CATEGORY).get();
 
     /**
      * Looks up a String key to a String value.
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
index 3a1ef00e1f..2731396bf5 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.plugins.di.Key;
  * Script Manager.
  */
 public interface ScriptManager {
-    Key<ScriptManager> KEY = new Key<>() {};
+    Key<ScriptManager> KEY = Key.forClass(ScriptManager.class);
 
     /**
      * Add scripts defined in the configuration.
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ContextSelector.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ContextSelector.java
index 8f313a8c91..789ef4322c 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ContextSelector.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ContextSelector.java
@@ -32,7 +32,7 @@ public interface ContextSelector {
 
     long DEFAULT_STOP_TIMEOUT = 50;
 
-    Key<ContextSelector> KEY = new Key<>() {};
+    Key<ContextSelector> KEY = Key.forClass(ContextSelector.class);
 
     /**
      * Shuts down the LoggerContext.
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java
index 3965ae5201..15bc96e5cf 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.plugins.di.Key;
  * @since 2.11
  */
 public interface Clock {
-    Key<Clock> KEY = new Key<>() {};
+    Key<Clock> KEY = Key.forClass(Clock.class);
 
     /**
      * Returns the time in milliseconds since the epoch.
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java
index df6db03e61..6ceb9bc5bc 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java
@@ -25,7 +25,7 @@ import org.apache.logging.log4j.plugins.di.Key;
  * @since 2.11
  */
 public interface NanoClock {
-    Key<NanoClock> KEY = new Key<>() {};
+    Key<NanoClock> KEY = Key.forClass(NanoClock.class);
 
     /**
      * Returns the current value of the running Java Virtual Machine's 
high-resolution time source, in nanoseconds.
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
index 128b619128..bc6b474c75 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
@@ -44,11 +44,9 @@ import 
org.apache.logging.log4j.layout.template.json.util.JsonWriter;
 import org.apache.logging.log4j.layout.template.json.util.Uris;
 import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Factory;
-import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
-import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.util.Strings;
 
 @Configurable(elementType = Layout.ELEMENT_TYPE)
@@ -105,8 +103,7 @@ public class JsonTemplateLayout implements StringLayout {
             final JsonWriter jsonWriter) {
 
         // Inject resolver factory and interceptor plugins.
-        final List<EventResolverFactory> resolverFactories =
-                configuration.getComponent(new 
@Namespace(EventResolverFactory.CATEGORY) Key<>() {});
+        final List<EventResolverFactory> resolverFactories = 
configuration.getComponent(EventResolverFactory.KEY);
         final Map<String, EventResolverFactory> resolverFactoryByName = 
resolverFactories.stream()
                 .collect(Collectors.toMap(
                         EventResolverFactory::getName,
@@ -119,7 +116,7 @@ public class JsonTemplateLayout implements StringLayout {
                         },
                         LinkedHashMap::new));
         final List<EventResolverInterceptor> resolverInterceptors =
-                configuration.getComponent(new 
@Namespace(EventResolverInterceptor.CATEGORY) Key<>() {});
+                configuration.getComponent(EventResolverInterceptor.KEY);
         final EventResolverStringSubstitutor substitutor =
                 new 
EventResolverStringSubstitutor(configuration.getStrSubstitutor());
 
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactory.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactory.java
index 53edf09c52..51a76ac029 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactory.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverFactory.java
@@ -16,7 +16,10 @@
  */
 package org.apache.logging.log4j.layout.template.json.resolver;
 
+import java.util.List;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.plugins.di.Key;
+import org.apache.logging.log4j.plugins.util.TypeUtil;
 
 /**
  * {@link TemplateResolverFactory} specialized for {@link LogEvent}s.
@@ -24,4 +27,10 @@ import org.apache.logging.log4j.core.LogEvent;
  * @see EventResolver
  * @see EventResolverContext
  */
-public interface EventResolverFactory extends 
TemplateResolverFactory<LogEvent, EventResolverContext> {}
+public interface EventResolverFactory extends 
TemplateResolverFactory<LogEvent, EventResolverContext> {
+
+    Key<List<EventResolverFactory>> KEY = 
Key.<List<EventResolverFactory>>builder(
+                    TypeUtil.createParameterizedType(List.class, 
EventResolverFactory.class))
+            .setNamespace(CATEGORY)
+            .get();
+}
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptor.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptor.java
index 57c318eaf2..3fe873a359 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptor.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverInterceptor.java
@@ -16,9 +16,17 @@
  */
 package org.apache.logging.log4j.layout.template.json.resolver;
 
+import java.util.List;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.plugins.di.Key;
+import org.apache.logging.log4j.plugins.util.TypeUtil;
 
 /**
  * {@link TemplateResolverInterceptor} specialized for {@link LogEvent}s.
  */
-public interface EventResolverInterceptor extends 
TemplateResolverInterceptor<LogEvent, EventResolverContext> {}
+public interface EventResolverInterceptor extends 
TemplateResolverInterceptor<LogEvent, EventResolverContext> {
+    Key<List<EventResolverInterceptor>> KEY = 
Key.<List<EventResolverInterceptor>>builder(
+                    TypeUtil.createParameterizedType(List.class, 
EventResolverInterceptor.class))
+            .setNamespace(CATEGORY)
+            .get();
+}
diff --git 
a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactoryTest.java
 
b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactoryTest.java
index 390958198f..c9af60fb9a 100644
--- 
a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactoryTest.java
+++ 
b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/ConfigurableInstanceFactoryTest.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.plugins.di;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -38,6 +39,7 @@ import 
org.apache.logging.log4j.plugins.test.validation.di.BaseBean;
 import org.apache.logging.log4j.plugins.test.validation.di.BetaBean;
 import org.apache.logging.log4j.plugins.test.validation.di.GammaBean;
 import org.apache.logging.log4j.plugins.test.validation.di.PrototypeBean;
+import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.validation.constraints.Required;
 import org.junit.jupiter.api.Test;
 
@@ -73,14 +75,16 @@ class ConfigurableInstanceFactoryTest {
 
     @Test
     void unknownInstanceError() {
-        final Key<UnknownInstance> key = new Key<>() {};
+        final Key<UnknownInstance> key = Key.forClass(UnknownInstance.class);
         assertThatThrownBy(() -> 
DI.createInitializedFactory().getInstance(key))
                 .hasMessage("No @Inject constructor or default constructor 
found for " + key);
     }
 
     @Test
     void optionalUnknownInstance() {
-        final Key<Optional<UnknownInstance>> key = new Key<>() {};
+        final Type type = TypeUtil.createParameterizedType(Optional.class, 
UnknownInstance.class);
+        final Key<Optional<UnknownInstance>> key =
+                Key.<Optional<UnknownInstance>>builder(type).get();
         assertThat(DI.createInitializedFactory().getInstance(key)).isEmpty();
     }
 
@@ -208,7 +212,10 @@ class ConfigurableInstanceFactoryTest {
     @Test
     void injectionPointValidationPartial() {
         final ConfigurableInstanceFactory instanceFactory = DI.builder()
-                .addInitialBindingFrom(new @Named("foo") Key<String>() {})
+                .addInitialBindingFrom(Key.builder(String.class)
+                        .setName("foo")
+                        .setQualifierType(Named.class)
+                        .get())
                 .toInstance("hello")
                 .build();
         assertThatThrownBy(() -> 
instanceFactory.getInstance(ValidatedInjectionPoints.class))
diff --git 
a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/KeysTest.java
 
b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/KeysTest.java
index 30428b11b2..3e6d1308a2 100644
--- 
a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/KeysTest.java
+++ 
b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/KeysTest.java
@@ -28,12 +28,6 @@ import org.junit.jupiter.api.Test;
 
 class KeysTest {
 
-    @Test
-    void configurableNamespace() {
-        final Key<String> key = new @Configurable Key<>() {};
-        assertEquals(Node.CORE_NAMESPACE, key.getNamespace());
-    }
-
     static class ConfigurableField {
         @Configurable
         String field;
diff --git 
a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java 
b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
index 2f8fb16b6f..a028c80fa0 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
@@ -52,7 +52,8 @@ public class Node {
     /**
      * Key describing the current node being configured.
      */
-    public static final Key<Node> CURRENT_NODE = new @PluginNode Key<>() {};
+    public static final Key<Node> CURRENT_NODE =
+            Key.builder(Node.class).setQualifierType(PluginNode.class).get();
 
     private Node parent;
     private final String name;
diff --git 
a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java 
b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java
index e2dd4910d7..57e5db538c 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java
@@ -19,7 +19,6 @@ package org.apache.logging.log4j.plugins.di;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.AnnotatedType;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Parameter;
@@ -64,30 +63,6 @@ public class Key<T> implements StringBuilderFormattable, 
Comparable<Key<T>> {
     @LazyInit
     private @Nullable String toString;
 
-    /**
-     * Anonymous subclasses override this constructor to instantiate this Key 
based on the type given.
-     * For example, to represent the equivalent of an annotated field {@code 
@Named("abc") Map<String, List<String>> field},
-     * this constructor would be used like so:
-     *
-     * <pre>{@code
-     * Key<Map<String, List<String>>> key = new @Named("abc") Key<>() {};
-     * // or equivalently
-     * var key = new @Named("abc") Key<Map<String, List<String>>>() {};
-     * }</pre>
-     */
-    protected Key() {
-        type = TypeUtil.getSuperclassTypeParameter(getClass());
-        rawType = TypeUtil.getRawType(type);
-        final AnnotatedType superclass = getClass().getAnnotatedSuperclass();
-        final Annotation qualifier =
-                
AnnotationUtil.getElementAnnotationHavingMetaAnnotation(superclass, 
QualifierType.class);
-        qualifierType = qualifier != null ? qualifier.annotationType() : null;
-        name = Strings.EMPTY;
-        namespace = Keys.getNamespace(superclass);
-        order = AnnotationUtil.getOrder(superclass);
-        hashCode = Objects.hash(type, qualifierType, 
name.toLowerCase(Locale.ROOT), namespace.toLowerCase(Locale.ROOT));
-    }
-
     private Key(
             final Type type,
             final Class<T> rawType,
diff --git 
a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/InjectionPoint.java
 
b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/InjectionPoint.java
index a47cc872f7..9da2fea958 100644
--- 
a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/InjectionPoint.java
+++ 
b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/InjectionPoint.java
@@ -29,7 +29,7 @@ import org.apache.logging.log4j.plugins.di.Keys;
 
 public record InjectionPoint<T>(Key<T> key, Collection<String> aliases, 
AnnotatedElement element) {
 
-    public static final Key<InjectionPoint<?>> CURRENT_INJECTION_POINT = new 
Key<>() {};
+    public static final Key<InjectionPoint> CURRENT_INJECTION_POINT = 
Key.forClass(InjectionPoint.class);
 
     public static <T> InjectionPoint<T> forField(final Field field) {
         final Key<T> key = Key.forField(field);
diff --git 
a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/StringValueResolver.java
 
b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/StringValueResolver.java
index 119874990d..bf2c2ce964 100644
--- 
a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/StringValueResolver.java
+++ 
b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/spi/StringValueResolver.java
@@ -29,7 +29,7 @@ import org.apache.logging.log4j.plugins.di.Key;
  */
 @FunctionalInterface
 public interface StringValueResolver {
-    Key<StringValueResolver> KEY = new Key<>() {};
+    Key<StringValueResolver> KEY = Key.forClass(StringValueResolver.class);
 
     StringValueResolver NOOP = s -> s;
 
diff --git 
a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
 
b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
index 43ef3d6289..0a792a7e3d 100644
--- 
a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
+++ 
b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
@@ -26,6 +26,8 @@ import java.util.Arrays;
 import java.util.Map;
 import java.util.Objects;
 import org.apache.logging.log4j.util.Cast;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
 
 /**
  * Utility class for working with Java {@link Type}s and derivatives. This 
class is adapted heavily from the
@@ -315,4 +317,35 @@ public final class TypeUtil {
         }
         return false;
     }
+
+    public static ParameterizedType createParameterizedType(final Type 
rawType, final Type... actualTypeArguments) {
+        return new SyntheticParameterizedType(rawType, actualTypeArguments, 
null);
+    }
+
+    @NullMarked
+    private record SyntheticParameterizedType(Type rawType, Type[] 
actualTypeArguments, @Nullable Type ownerType)
+            implements ParameterizedType {
+        @Override
+        public Type[] getActualTypeArguments() {
+            return actualTypeArguments.clone();
+        }
+
+        @Override
+        public Type getRawType() {
+            return rawType;
+        }
+
+        @Override
+        public @Nullable Type getOwnerType() {
+            return ownerType;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            return obj instanceof ParameterizedType type
+                    && Objects.equals(rawType, type.getRawType())
+                    && Objects.equals(ownerType, type.getOwnerType())
+                    && Arrays.equals(actualTypeArguments, 
type.getActualTypeArguments());
+        }
+    }
 }

Reply via email to