This is an automated email from the ASF dual-hosted git repository.
rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwebbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 8ee9f5f [OWB-1376] fix unsafe usage to define classes
8ee9f5f is described below
commit 8ee9f5fb288131444aeb880fad24cc99f86a9091
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Sat Mar 13 21:04:32 2021 +0100
[OWB-1376] fix unsafe usage to define classes
---
.../java/org/apache/webbeans/proxy/Unsafe.java | 31 ++++++++++++++++++----
1 file changed, 26 insertions(+), 5 deletions(-)
diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/proxy/Unsafe.java
b/webbeans-impl/src/main/java/org/apache/webbeans/proxy/Unsafe.java
index 2085883..9beb112 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/proxy/Unsafe.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/proxy/Unsafe.java
@@ -26,6 +26,7 @@ import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.ProtectionDomain;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.apache.webbeans.exception.ProxyGenerationException;
@@ -38,8 +39,8 @@ public class Unsafe
* We use it for creating the proxy instance without fully
* initializing the class.
*/
- private Object unsafe;
- private Object internalUnsafe;
+ private final Object unsafe;
+ private final Object internalUnsafe;
private Method unsafeAllocateInstance;
private final AtomicReference<Method> unsafeDefineClass = new
AtomicReference<>();
@@ -66,7 +67,7 @@ public class Unsafe
{
final Field theInternalUnsafe =
unsafeClass.getDeclaredField("theInternalUnsafe");
theInternalUnsafe.setAccessible(true);
- return theInternalUnsafe.get(null).getClass();
+ return theInternalUnsafe.get(null);
}
catch (final Exception notJ11OrMore)
{
@@ -172,7 +173,7 @@ public class Unsafe
else
{
- definedClass = (Class<T>) unsafeDefineClass().invoke(unsafe,
proxyName, proxyBytes, 0, proxyBytes.length, classLoader, null);
+ definedClass = (Class<T>)
unsafeDefineClass().invoke(internalUnsafe, proxyName, proxyBytes, 0,
proxyBytes.length, classLoader, null);
}
return (Class<T>) Class.forName(definedClass.getName(), true,
classLoader);
@@ -190,7 +191,10 @@ public class Unsafe
// default error handling
}
}
- throw new ProxyGenerationException(le.getCause());
+ throw new ProxyGenerationException(
+ le.getMessage() + (isJava16OrMore() ? "\n" +
+ "On Java 16 ensure to set --add-exports
java.base/jdk.internal.misc=ALL-UNNAMED on the JVM" : ""),
+ le.getCause());
}
catch (Throwable e)
{
@@ -198,6 +202,23 @@ public class Unsafe
}
}
+ private boolean isJava16OrMore()
+ {
+ final String version = System.getProperty("java.version", "-1");
+ final int end = IntStream.of(version.indexOf('-'),
version.indexOf('.'))
+ .filter(i -> i > 0)
+ .min()
+ .orElseGet(version::length);
+ try
+ {
+ return Integer.parseInt(version.substring(0, end)) >= 16;
+ }
+ catch (final NumberFormatException nfe)
+ {
+ return false;
+ }
+ }
+
private Method unsafeDefineClass()
{
Method value = unsafeDefineClass.get();