package net.jeeeyul.eclipse.themes.rendering.internal;
import java.lang.reflect.Field;
/**
* It provides abstraction for accessing field with Java Reflection. Used by
* {@link JTabRendererHelper}.
*
* @param <T>
* Type
* @param <FT>
* Field Type
*
* @author Jeeeyul
* @since 2.0.0
*/
public class HackedField<T, FT> {
private Class<T> type;
private String name;
private Field field;
private Field getField() {
if (field == null) {
try {
field = type.getDeclaredField(name);
field.setAccessible(true);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return field;
}
/**
*
* @param type
* Type.
* @param name
* Field name.
*/
public HackedField(Class<T> type, String name) {
this.type = type;
this.name = name;
}
/**
*
* @param obj
* field owner.
* @return field value.
* @since 2.0.0
*/
@SuppressWarnings("unchecked")
public FT get(Object obj) {
try {
return (FT) getField().get(obj);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* sets a new field value.
*
* @param obj
* owner to set field.
* @param value
* new value for field.
* @return new field value.
*/
public FT set(Object obj, FT value) {
try {
getField().set(obj, value);
return value;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}