Skip to content

Commit

Permalink
Java 16 reflection patch
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Aug 17, 2021
1 parent f0d6fa3 commit 996bb81
Showing 1 changed file with 28 additions and 6 deletions.
Expand Up @@ -145,6 +145,7 @@ public static MethodHandle getFinalSetter(Class<?> clazz, String field) {
}
Field f = getFields(clazz).get(field);
if (f == null) {
Debug.echoError("Create get final setter for unknown field '" + field + "' (for class '" + clazz.getName() + "')");
return null;
}
int mod = f.getModifiers();
Expand All @@ -153,8 +154,27 @@ public static MethodHandle getFinalSetter(Class<?> clazz, String field) {
validateUnsafe();
boolean isStatic = Modifier.isStatic(mod);
long offset = (long) (isStatic ? UNSAFE_STATIC_FIELD_OFFSET.invoke(f) : UNSAFE_FIELD_OFFSET.invoke(f));
result = isStatic ? MethodHandles.insertArguments(UNSAFE_PUT_OBJECT, 0, clazz, offset)
: MethodHandles.insertArguments(UNSAFE_PUT_OBJECT, 1, offset);
MethodHandle method = UNSAFE_PUT_OBJECT;
if (f.getType().isPrimitive()) {
if (f.getType() == float.class) {
method = UNSAFE_PUT_FLOAT;
}
else if (f.getType() == double.class) {
method = UNSAFE_PUT_DOUBLE;
}
else if (f.getType() == int.class) {
method = UNSAFE_PUT_INT;
}
else if (f.getType() == long.class) {
method = UNSAFE_PUT_LONG;
}
else {
Debug.echoError("Cannot create a setter for primitive type '" + f.getType().getName() + "'");
return null;
}
}
result = isStatic ? MethodHandles.insertArguments(method, 0, clazz, offset)
: MethodHandles.insertArguments(method, 1, offset);
}
else {
if (Modifier.isFinal(mod)) {
Expand Down Expand Up @@ -185,6 +205,10 @@ private static void validateUnsafe() {
UNSAFE_STATIC_FIELD_OFFSET = getMethodHandle(UNSAFE.getClass(), "staticFieldOffset", Field.class).bindTo(UNSAFE);
UNSAFE_FIELD_OFFSET = getMethodHandle(UNSAFE.getClass(), "objectFieldOffset", Field.class).bindTo(UNSAFE);
UNSAFE_PUT_OBJECT = getMethodHandle(UNSAFE.getClass(), "putObject", Object.class, long.class, Object.class).bindTo(UNSAFE);
UNSAFE_PUT_FLOAT = getMethodHandle(UNSAFE.getClass(), "putFloat", Object.class, long.class, float.class).bindTo(UNSAFE);
UNSAFE_PUT_DOUBLE = getMethodHandle(UNSAFE.getClass(), "putDouble", Object.class, long.class, double.class).bindTo(UNSAFE);
UNSAFE_PUT_INT = getMethodHandle(UNSAFE.getClass(), "putInt", Object.class, long.class, int.class).bindTo(UNSAFE);
UNSAFE_PUT_LONG = getMethodHandle(UNSAFE.getClass(), "putLong", Object.class, long.class, long.class).bindTo(UNSAFE);
}
}

Expand All @@ -203,15 +227,13 @@ public static void giveReflectiveAccess(Class<?> from, Class<?> to) {

static {
giveReflectiveAccess(Field.class, ReflectionHelper.class);
MODIFIERS_FIELD = ((CheckingFieldMap) getFields(Field.class)).getNoCheck("modifiers");
MODIFIERS_FIELD = getFields(Field.class).getNoCheck("modifiers");
}

private static Method ADD_OPENS;
private static Method GET_MODULE;
private static MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
private static Field MODIFIERS_FIELD;
private static Object UNSAFE;
private static MethodHandle UNSAFE_FIELD_OFFSET;
private static MethodHandle UNSAFE_PUT_OBJECT;
private static MethodHandle UNSAFE_STATIC_FIELD_OFFSET;
private static MethodHandle UNSAFE_FIELD_OFFSET, UNSAFE_PUT_OBJECT, UNSAFE_PUT_FLOAT, UNSAFE_PUT_DOUBLE, UNSAFE_PUT_INT, UNSAFE_PUT_LONG, UNSAFE_STATIC_FIELD_OFFSET;
}

0 comments on commit 996bb81

Please sign in to comment.