From a40769a666a8370c7cda6a72580a3dbb8ddb86f8 Mon Sep 17 00:00:00 2001 From: Jan Luehe Date: Sun, 25 May 2025 10:33:43 +0200 Subject: [PATCH] Have org.apache.logging.log4j.util.Base64Util invoke java.util.Base64 directly instead of reflectively (#3686) --- .../apache/logging/log4j/util/Base64Util.java | 40 ++----------------- ...ase64_directly_instead_of_reflectively.xml | 8 ++++ 2 files changed, 11 insertions(+), 37 deletions(-) create mode 100644 src/changelog/.2.x.x/3686_invoke_java_util_base64_directly_instead_of_reflectively.xml diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Base64Util.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Base64Util.java index 4733c1df363..b2c3f5fcafe 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Base64Util.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Base64Util.java @@ -16,11 +16,8 @@ */ package org.apache.logging.log4j.util; -import java.lang.reflect.Method; import java.nio.charset.Charset; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LoggingException; -import org.apache.logging.log4j.status.StatusLogger; +import java.util.Base64; /** * Base64 encodes Strings. This utility is only necessary because the mechanism to do this changed in Java 8 and @@ -30,27 +27,7 @@ */ public final class Base64Util { - private static final Logger LOGGER = StatusLogger.getLogger(); - - private static Method encodeMethod = null; - private static Object encoder = null; - - static { - try { - final Class clazz = LoaderUtil.loadClass("java.util.Base64"); - final Class encoderClazz = LoaderUtil.loadClass("java.util.Base64$Encoder"); - final Method method = clazz.getMethod("getEncoder"); - encoder = method.invoke(null); - encodeMethod = encoderClazz.getMethod("encodeToString", byte[].class); - } catch (Exception ex) { - try { - final Class clazz = LoaderUtil.loadClass("javax.xml.bind.DataTypeConverter"); - encodeMethod = clazz.getMethod("printBase64Binary"); - } catch (Exception ex2) { - LOGGER.error("Unable to create a Base64 Encoder", ex2); - } - } - } + private static final Base64.Encoder ENCODER = Base64.getEncoder(); private Base64Util() {} @@ -60,17 +37,6 @@ private Base64Util() {} */ @Deprecated public static String encode(final String str) { - if (str == null) { - return null; - } - final byte[] data = str.getBytes(Charset.defaultCharset()); - if (encodeMethod != null) { - try { - return (String) encodeMethod.invoke(encoder, data); - } catch (Exception ex) { - throw new LoggingException("Unable to encode String", ex); - } - } - throw new LoggingException("No Encoder, unable to encode string"); + return str != null ? ENCODER.encodeToString(str.getBytes(Charset.defaultCharset())) : null; } } diff --git a/src/changelog/.2.x.x/3686_invoke_java_util_base64_directly_instead_of_reflectively.xml b/src/changelog/.2.x.x/3686_invoke_java_util_base64_directly_instead_of_reflectively.xml new file mode 100644 index 00000000000..7f2a4641c09 --- /dev/null +++ b/src/changelog/.2.x.x/3686_invoke_java_util_base64_directly_instead_of_reflectively.xml @@ -0,0 +1,8 @@ + + + + Have org.apache.logging.log4j.util.Base64Util invoke java.util.Base64 directly instead of reflectively. +