public Unsafe()

in webbeans-impl/src/main/java/org/apache/webbeans/proxy/Unsafe.java [59:135]


    public Unsafe()
    {
        final Class<?> unsafeClass = getUnsafeClass();

        this.unsafe = AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
            try
            {
                Field field = unsafeClass.getDeclaredField("theUnsafe");
                field.setAccessible(true);
                return field.get(null);
            }
            catch (Exception e)
            {
                WebBeansLoggerFacade.getLogger(Unsafe.class)
                      .info("Cannot get sun.misc.Unsafe - will use newInstance() instead!");
                return null;
            }
        });
        this.internalUnsafe = AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
            try // j11, unwrap unsafe, it owns defineClass now and no more theUnsafe
            {
                final Field theInternalUnsafe = unsafeClass.getDeclaredField("theInternalUnsafe");
                theInternalUnsafe.setAccessible(true);
                return theInternalUnsafe.get(null);
            }
            catch (final Exception notJ11OrMore) {
                return unsafe;
            }
        });

        if (unsafe != null)
        {
            unsafeAllocateInstance = AccessController.doPrivileged((PrivilegedAction<Method>) () -> {
                try
                {
                    Method mtd = unsafe.getClass().getDeclaredMethod("allocateInstance", Class.class);
                    mtd.setAccessible(true);
                    return mtd;
                }
                catch (Exception e)
                {
                    return null; // use newInstance()
                }
            });

            try {
                final Class<?> rootLoaderClass = Class.forName("java.lang.ClassLoader");
                try {
                    final Method getModule = Class.class.getMethod("getModule");
                    final Object module = getModule.invoke(rootLoaderClass);
                    if (module != null)
                    {
                        final Method isOpen = module.getClass().getMethod("isOpen", String.class);
                        if (Boolean.class.cast(isOpen.invoke(module, "sun.misc")))
                        {
                            oldStyleSetAccessibleDefineClass(rootLoaderClass);
                        }
                        else
                        {
                            hackSetDefineClassAccessible();
                        }
                    } else
                    { // very unlikely since we should fall into unamed module
                        hackSetDefineClassAccessible();
                    }
                }
                catch (final NoSuchMethodException nsme)
                { // pre java 9
                    oldStyleSetAccessibleDefineClass(rootLoaderClass);
                }
            }
            catch (final Exception e)
            {
                hackSetDefineClassAccessible();
            }
        }
    }