package com.antfortune.freeline.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectUtil {
public static Object invokeMethod(String className, String methodName, Class[] cls,
Object[] args) throws Exception {
Class clazz = Class.forName(className);
return invokeMethod(clazz, null, methodName, cls, args);
}
public static Object invokeMethod(Object object, String methodName, Class[] cls,
Object[] args) throws Exception {
Class clazz = object.getClass();
return invokeMethod(clazz, object, methodName, cls, args);
}
public static Object invokeMethod(Object object, String methodName) throws Exception {
Class clazz = object.getClass();
return invokeMethod(clazz, object, methodName, null, null);
}
public static Object invokeMethod(Class clazz, Object object, String methodName, Class[] cls,
Object[] args) throws Exception {
Method method;
if (null == cls) {
method = clazz.getDeclaredMethod(methodName);
} else {
method = clazz.getDeclaredMethod(methodName, cls);
}
method.setAccessible(true);
if (null == args) {
return method.invoke(object);
} else {
return method.invoke(object, args);
}
}
public static Field fieldGetOrg(Object object, String name) throws Exception {
Field field = object.getClass().getDeclaredField(name);
field.setAccessible(true);
return field;
}
public static Field fieldGetOrg(Object object, Class<?> clazz, String name) throws Exception {
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
return field;
}
public static void fieldSet(Object object, String fieldName, Object value)
throws Exception {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);
}
public static void fieldSet(Object object, Class<?> clazz, String fieldName,
Object value) throws Exception {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);
}
public static Object fieldGet(Object object, String fieldName) throws Exception {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(object);
}
public static Object fieldGet(Object object, Class<?> clazz, String fieldName)
throws Exception {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(object);
}
public static Object getStaticFieldValue(Class<?> clazz, String fieldName) throws Exception {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(fieldName);
}
public static Object getField(Object obj, String fieldName)
throws NoSuchFieldException, IllegalAccessException {
return prepareField(obj.getClass(), fieldName).get(obj);
}
public static void setField(Object obj, String fieldName, Object value)
throws NoSuchFieldException, IllegalAccessException {
prepareField(obj.getClass(), fieldName).set(obj, value);
}
private static Field prepareField(Class c, String fieldName)
throws NoSuchFieldException {
while (c != null) {
try {
Field f = c.getDeclaredField(fieldName);
f.setAccessible(true);
return f;
} catch (Exception e) {
} finally {
c = c.getSuperclass();
}
}
throw new NoSuchFieldException();
}
}