Class AccessibleObjectHandlerJDK9Plus
- java.lang.Object
-
- ognl.AccessibleObjectHandlerJDK9Plus
-
- All Implemented Interfaces:
AccessibleObjectHandler
class AccessibleObjectHandlerJDK9Plus extends java.lang.Object implements AccessibleObjectHandler
Utilizes a JDK 9 and later mechanism for changing the accessibility level of a given AccessibleObject.If the JDK 9+ mechanism fails, this class will fall back to a standard pre-JDK 9 reflection mechanism. Note: That may cause "WARNING: Illegal reflective access" output to be generated to stdout/stderr.
For reference, this class draws on information from the following locations: - Post about Illegal Reflective Access what is an illegal reflective access - Blog on Unsafe Java Magic. Part 4: sun.misc.Unsafe - Blog on Unsafe Guide to sun.misc.Unsafe - JEP about access to Unsafe being retained in JDK 9 JEP 260: Encapsulate Most Internal APIs
In addition to the above, inspiration was drawn from Gson: PR 1218, PR 1306.
Appreciation and credit to the authors, contributors and commenters for the information contained in the preceding links.
- Since:
- 3.1.24
-
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.reflect.FieldACCESSIBLE_OBJECT_OVERRIDE_FIELDprivate static longACCESSIBLE_OBJECT_OVERRIDE_FIELD_OFFSETprivate static java.lang.Class<?>CLAZZ_UNSAFEprivate static java.lang.ObjectUNSAFE_INSTANCEprivate static java.lang.reflect.MethodUNSAFE_OBJECT_FIELD_OFFSET_METHODprivate static java.lang.reflect.MethodUNSAFE_PUT_BOOLEAN_METHOD
-
Constructor Summary
Constructors Modifier Constructor Description privateAccessibleObjectHandlerJDK9Plus()Private constructor
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) static AccessibleObjectHandlercreateHandler()Package-level generator of an AccessibleObjectHandlerJDK9Plus instance.private static longdetermineAccessibleObjectOverrideFieldOffset()Attempt to determine the AccessibleObject override field offset.private static java.lang.reflect.FieldinstantiateAccessibleObjectOverrideField()Instantiate an AccessibleObject override field instance.private static java.lang.Class<?>instantiateClazzUnsafe()Instantiate an instance of the Unsafe class.private static java.lang.ObjectinstantiateUnsafeInstance()Instantiate an instance of Unsafe object.private static java.lang.reflect.MethodinstantiateUnsafeObjectFieldOffsetMethod()Instantiate an Unsafe.objectFieldOffset() method instance.private static java.lang.reflect.MethodinstantiateUnsafePutBooleanMethod()Instantiate an Unsafe.putBoolean() method instance.voidsetAccessible(java.lang.reflect.AccessibleObject accessibleObject, boolean flag)Utilize accessibility modification mechanism for JDK 9 (Java Major Version 9) and later.(package private) static booleanunsafeOrDescendant(java.lang.Class<?> clazz)Package-accessible method to determine if a given class is Unsafe or a descendant of Unsafe.
-
-
-
Field Detail
-
CLAZZ_UNSAFE
private static final java.lang.Class<?> CLAZZ_UNSAFE
-
UNSAFE_INSTANCE
private static final java.lang.Object UNSAFE_INSTANCE
-
UNSAFE_OBJECT_FIELD_OFFSET_METHOD
private static final java.lang.reflect.Method UNSAFE_OBJECT_FIELD_OFFSET_METHOD
-
UNSAFE_PUT_BOOLEAN_METHOD
private static final java.lang.reflect.Method UNSAFE_PUT_BOOLEAN_METHOD
-
ACCESSIBLE_OBJECT_OVERRIDE_FIELD
private static final java.lang.reflect.Field ACCESSIBLE_OBJECT_OVERRIDE_FIELD
-
ACCESSIBLE_OBJECT_OVERRIDE_FIELD_OFFSET
private static final long ACCESSIBLE_OBJECT_OVERRIDE_FIELD_OFFSET
-
-
Method Detail
-
unsafeOrDescendant
static boolean unsafeOrDescendant(java.lang.Class<?> clazz)
Package-accessible method to determine if a given class is Unsafe or a descendant of Unsafe.- Parameters:
clazz- the Class upon which to perform the unsafe check.- Returns:
- true if parameter is Unsafe or a descendant, false otherwise
-
instantiateClazzUnsafe
private static java.lang.Class<?> instantiateClazzUnsafe()
Instantiate an instance of the Unsafe class.- Returns:
- class if available, null otherwise
-
instantiateUnsafeInstance
private static java.lang.Object instantiateUnsafeInstance()
Instantiate an instance of Unsafe object.- Returns:
- instance if available, null otherwise
-
instantiateUnsafeObjectFieldOffsetMethod
private static java.lang.reflect.Method instantiateUnsafeObjectFieldOffsetMethod()
Instantiate an Unsafe.objectFieldOffset() method instance.- Returns:
- method if available, null otherwise
-
instantiateUnsafePutBooleanMethod
private static java.lang.reflect.Method instantiateUnsafePutBooleanMethod()
Instantiate an Unsafe.putBoolean() method instance.- Returns:
- method if available, null otherwise
-
instantiateAccessibleObjectOverrideField
private static java.lang.reflect.Field instantiateAccessibleObjectOverrideField()
Instantiate an AccessibleObject override field instance.- Returns:
- field if available, null otherwise
-
determineAccessibleObjectOverrideFieldOffset
private static long determineAccessibleObjectOverrideFieldOffset()
Attempt to determine the AccessibleObject override field offset.- Returns:
- field offset if available, -1 otherwise
-
createHandler
static AccessibleObjectHandler createHandler()
Package-level generator of an AccessibleObjectHandlerJDK9Plus instance.Not intended for use outside of the package.
Note: An AccessibleObjectHandlerJDK9Plus will only be created if running on a JDK9+ and the environment flag is set. Otherwise this method will return an AccessibleHandlerPreJDK9 instance instead,
- Returns:
- an AccessibleObjectHandler instance
- Since:
- 3.1.24
-
setAccessible
public void setAccessible(java.lang.reflect.AccessibleObject accessibleObject, boolean flag)Utilize accessibility modification mechanism for JDK 9 (Java Major Version 9) and later. Should that mechanism fail, attempt a standard pre-JDK9 accessibility modification.- Specified by:
setAccessiblein interfaceAccessibleObjectHandler- Parameters:
accessibleObject- the AccessibleObject upon which to apply the flag.flag- the new accessible flag value.
-
-