package me.hao0.antares.common.util;
import sun.misc.Unsafe;
import java.lang.reflect.Field;
/**
* The reflection util based on Unsafe
*/
public abstract class Fields {
private static final Unsafe unsafe = getUnsafe();
private static Unsafe getUnsafe() {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
return (Unsafe) f.get(null);
} catch (Exception e) {
throw new RuntimeException("failed to get unsafe instance, cause");
}
}
/**
* put field to target object
* @param target target object
* @param name field name
* @param value field valiue
*/
public static void put(Object target, String name, Object value){
try {
Field field = target.getClass().getField(name);
field.setAccessible(true);
long fieldOffset = unsafe.objectFieldOffset(field);
unsafe.putObject(target, fieldOffset, value);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
}
/**
* put field to target object
* @param target target object
* @param field object field
* @param value field valiue
*/
public static void put(Object target, Field field, Object value) {
try {
field.setAccessible(true);
long fieldOffset = unsafe.objectFieldOffset(field);
unsafe.putObject(target, fieldOffset, value);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* get field of target object
* @param target target object
* @param name field name
* @param <T> generic type
* @return the field value
*/
public static <T> T get(Object target, String name) {
try {
return get(target, target.getClass().getDeclaredField(name));
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
}
/**
* get field of target object
* @param target target object
* @param field field
* @param <T> generic type
* @return the field value
*/
@SuppressWarnings("unchecked")
public static <T> T get(Object target, Field field) {
try {
long fieldOffset = unsafe.objectFieldOffset(field);
return (T)unsafe.getObject(target, fieldOffset);
} catch (Exception e){
throw new RuntimeException(e);
}
}
}