Skip to content

Commit

Permalink
add a load-time Reflection error catcher+reporter
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Oct 23, 2019
1 parent fa25d8a commit 56ee505
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 6 deletions.
@@ -1,6 +1,7 @@
package com.denizenscript.denizen.nms.util;

import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.denizenscript.denizen.utilities.DenizenAPI;
import com.denizenscript.denizen.utilities.debugging.Debug;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
Expand All @@ -16,6 +17,15 @@ public class ReflectionHelper {

private static final Map<Class, Map<String, MethodHandle>> cachedFieldSetters = new HashMap<>();

public static void setFieldValue(Class clazz, String fieldName, Object object, Object value) {
try {
getFields(clazz).get(fieldName).set(object, value);
}
catch (Throwable ex) {
Debug.echoError(ex);
}
}

public static <T> T getFieldValue(Class clazz, String fieldName, Object object) {
Map<String, Field> cache = getFields(clazz);
try {
Expand All @@ -32,15 +42,36 @@ public static <T> T getFieldValue(Class clazz, String fieldName, Object object)
}
}

public static void setFieldValue(Class clazz, String fieldName, Object object, Object value) {
public static class CheckingFieldMap extends HashMap<String, Field> {

public Class<?> clazz;

public CheckingFieldMap(Class<?> clazz) {
this.clazz = clazz;
}

@Override
public Field get(Object name) {
Field f = super.get(name);
if (f == null) {
String err = "Reflection field missing - Tried to read field '" + name + "' of class '" + clazz.getCanonicalName() + "'.";
DenizenAPI.getCurrentInstance().getLogger().warning(err);
Debug.echoError(err);
}
return f;
}

public Field getNoCheck(String name) {
return super.get(name);
}
}

public static Map<String, Field> getFields(Class clazz) {
Map<String, Field> fields = cachedFields.get(clazz);
if (fields != null) {
return fields;
}
fields = new HashMap<>();
fields = new CheckingFieldMap(clazz);
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
fields.put(field.getName(), field);
Expand Down Expand Up @@ -127,7 +158,7 @@ private static void validateUnsafe() {
}

private static MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
private static Field MODIFIERS_FIELD = getFields(Field.class).get("modifiers");
private static Field MODIFIERS_FIELD = ((CheckingFieldMap) getFields(Field.class)).getNoCheck("modifiers");
private static Object UNSAFE;
private static MethodHandle UNSAFE_FIELD_OFFSET;
private static MethodHandle UNSAFE_PUT_OBJECT;
Expand Down
Expand Up @@ -28,8 +28,6 @@ public class PlayerHelperImpl extends PlayerHelper {
public static final Field FLY_TICKS = PLAYER_CONNECTION_FIELDS.get("C");
public static final Field VEHICLE_FLY_TICKS = PLAYER_CONNECTION_FIELDS.get("E");

public static final Field PLAYER_MAP = ReflectionHelper.getFields(PlayerChunkMap.class).get("y");

@Override
public int getFlyKickCooldown(Player player) {
PlayerConnection conn = ((CraftPlayer) player).getHandle().playerConnection;
Expand Down

0 comments on commit 56ee505

Please sign in to comment.