package org.xmind.cathy.internal.css;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectionSupport<T> {
private Class<?> type;
public ReflectionSupport(Class<T> type) {
this.type = type;
}
public Object getFieldValue(Field field, T instance) {
Object value = null;
if (field != null) {
boolean accessible = field.isAccessible();
try {
field.setAccessible(true);
value = field.get(instance);
} catch (Exception exc) {
// do nothing
} finally {
field.setAccessible(accessible);
}
}
return value;
}
public Object getFieldValue(String name, T instance) {
Field field = getField(name);
return getFieldValue(field, instance);
}
public Field getField(String name) {
while (!type.equals(Object.class)) {
try {
return type.getDeclaredField(name);
} catch (Exception exc) {
type = type.getSuperclass();
}
}
return null;
}
public Object set(Object obj, String name, Object value) {
try {
Field field = getField(name);
boolean accessible = field.isAccessible();
field.setAccessible(true);
field.set(obj, value);
field.setAccessible(accessible);
return value;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Object executeMethod(Method method, T instance, Object... params) {
Object value = null;
if (method != null) {
boolean accessible = method.isAccessible();
try {
method.setAccessible(true);
value = method.invoke(instance, params);
} catch (Exception exc) {
// do nothing
} finally {
method.setAccessible(accessible);
}
}
return value;
}
public Method getMethod(String name, Class<?>... params) {
while (!type.equals(Object.class)) {
try {
return type.getDeclaredMethod(name, params);
} catch (Exception exc) {
type = type.getSuperclass();
}
}
return null;
}
}