/*
* Copyright (C) 2014 Divide.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.divide.shared.util;
import java.lang.reflect.*;
public class ReflectionUtils {
private ReflectionUtils(){} // never init
public static Object getObjectField(Object o, String fieldName) throws NoSuchFieldException, IllegalAccessException {
Field f = getClassField(o.getClass(),fieldName);
makeAccessible(f);
return f.get(o);
}
public static void setObjectField(Object o, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
Field f = getClassField(o.getClass(),fieldName);
makeAccessible(f);
f.set(o,value);
}
public static Object invoke(Object o,Method method, Object... param) throws InvocationTargetException, IllegalAccessException {
return method.invoke(o,param);
}
public static Method getObjectMethod(Object object, String methodName, Class<?>... paramsTypes) throws NoSuchMethodException {
Method m = getClassMethod(object.getClass(),methodName, paramsTypes);
makeAccessible(m);
return m;
}
public static Method getClassMethod(Class clazz,String methodName, Class<?>... fieldParams) throws NoSuchMethodException {
try {
return clazz.getDeclaredMethod(methodName,fieldParams);
} catch (NoSuchMethodException e) {
Class superClass = clazz.getSuperclass();
if (superClass == null) {
throw e;
} else {
return getClassMethod(superClass,methodName,fieldParams);
}
}
}
public static Field getClassField(Class clazz, String fieldName) throws NoSuchFieldException {
try {
return clazz.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
Class superClass = clazz.getSuperclass();
if (superClass == null) {
throw e;
} else {
return getClassField(superClass, fieldName);
}
}
}
private static void makeAccessible(Method method) {
if (!Modifier.isPublic(method.getModifiers()) ||
!Modifier.isPublic(method.getDeclaringClass().getModifiers()))
{
method.setAccessible(true);
}
}
private static void makeAccessible(Field field) {
if (!Modifier.isPublic(field.getModifiers()) ||
!Modifier.isPublic(field.getDeclaringClass().getModifiers()))
{
field.setAccessible(true);
}
}
public static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
public static <Type> Type getFinalStatic(Class clazz, String fieldName, Class<Type> returnType) throws Exception {
Field field = getClassField(clazz,fieldName);
field.setAccessible(true);
// Field modifiersField = Field.class.getDeclaredField("modifiers");
// modifiersField.setAccessible(true);
// modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
return returnType.cast(field.get(null));
}
}