You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2020/02/16 19:00:08 UTC

[logging-log4j2] branch master updated: [LOG4J2-2604/2649] Change MethodHandle to Constructor to adapt graalvm (#291)

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

rgoers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/master by this push:
     new 6b9035d  [LOG4J2-2604/2649] Change MethodHandle to Constructor to adapt graalvm (#291)
6b9035d is described below

commit 6b9035d8a2fb85cefe23e7a80aa17d6b4337604c
Author: terrence <Mh...@users.noreply.github.com>
AuthorDate: Mon Feb 17 02:59:58 2020 +0800

    [LOG4J2-2604/2649] Change MethodHandle to Constructor to adapt graalvm (#291)
    
    * change MethodHandle to Constructor
    
    * format space.
    
    * add comment about why change to Constructor
---
 .../log4j/core/impl/ContextDataFactory.java        | 32 ++++++++++++----------
 1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java
index 70b548d..2a152d7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java
@@ -16,9 +16,7 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodType;
+import java.lang.reflect.Constructor;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -48,11 +46,17 @@ import org.apache.logging.log4j.util.StringMap;
  * @since 2.7
  */
 public class ContextDataFactory {
-    private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
     private static final String CLASS_NAME = PropertiesUtil.getProperties().getStringProperty("log4j2.ContextData");
     private static final Class<? extends StringMap> CACHED_CLASS = createCachedClass(CLASS_NAME);
-    private static final MethodHandle DEFAULT_CONSTRUCTOR = createDefaultConstructor(CACHED_CLASS);
-    private static final MethodHandle INITIAL_CAPACITY_CONSTRUCTOR = createInitialCapacityConstructor(CACHED_CLASS);
+
+    /**
+     * In LOG4J2-2649 (https://issues.apache.org/jira/browse/LOG4J2-2649),
+     * the reporter said some reason about using graalvm to static compile.
+     * In graalvm doc (https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md),
+     * graalvm is not support MethodHandle now, so the Constructor need not to return MethodHandle.
+     */
+    private static final Constructor<?> DEFAULT_CONSTRUCTOR = createDefaultConstructor(CACHED_CLASS);
+    private static final Constructor<?> INITIAL_CAPACITY_CONSTRUCTOR = createInitialCapacityConstructor(CACHED_CLASS);
 
     private static final StringMap EMPTY_STRING_MAP = createContextData(0);
 
@@ -71,24 +75,24 @@ public class ContextDataFactory {
         }
     }
 
-    private static MethodHandle createDefaultConstructor(final Class<? extends StringMap> cachedClass) {
+    private static Constructor<?> createDefaultConstructor(final Class<? extends StringMap> cachedClass){
         if (cachedClass == null) {
             return null;
         }
         try {
-            return LOOKUP.findConstructor(cachedClass, MethodType.methodType(void.class));
-        } catch (final NoSuchMethodException | IllegalAccessException ignored) {
+            return cachedClass.getConstructor();
+        } catch (final NoSuchMethodException | IllegalAccessError ignored) {
             return null;
         }
     }
 
-    private static MethodHandle createInitialCapacityConstructor(final Class<? extends StringMap> cachedClass) {
+    private static Constructor<?> createInitialCapacityConstructor(final Class<? extends StringMap> cachedClass){
         if (cachedClass == null) {
             return null;
         }
         try {
-            return LOOKUP.findConstructor(cachedClass, MethodType.methodType(void.class, int.class));
-        } catch (final NoSuchMethodException | IllegalAccessException ignored) {
+            return cachedClass.getConstructor(int.class);
+        } catch (final NoSuchMethodException | IllegalAccessError ignored) {
             return null;
         }
     }
@@ -98,7 +102,7 @@ public class ContextDataFactory {
             return new SortedArrayStringMap();
         }
         try {
-            return (IndexedStringMap) DEFAULT_CONSTRUCTOR.invoke();
+            return (IndexedStringMap) DEFAULT_CONSTRUCTOR.newInstance();
         } catch (final Throwable ignored) {
             return new SortedArrayStringMap();
         }
@@ -109,7 +113,7 @@ public class ContextDataFactory {
             return new SortedArrayStringMap(initialCapacity);
         }
         try {
-            return (IndexedStringMap) INITIAL_CAPACITY_CONSTRUCTOR.invoke(initialCapacity);
+            return (IndexedStringMap) INITIAL_CAPACITY_CONSTRUCTOR.newInstance(initialCapacity);
         } catch (final Throwable ignored) {
             return new SortedArrayStringMap(initialCapacity);
         }