/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.util;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Reflection tools class.
*
* @author Stephane
*/
public class ReflectionUtil
{
/**
* Return the Method object corresponding to the specified method name and parameters.
*/
public static Method getMethod(Class<?> objectClass, String methodName, boolean forceAccess,
Class<?>... parameterTypes) throws SecurityException, NoSuchMethodException
{
Class<?> clazz = objectClass;
Method result = null;
while ((clazz != null) && (result == null))
{
try
{
result = clazz.getDeclaredMethod(methodName, parameterTypes);
}
catch (NoSuchMethodException e)
{
// ignore
}
clazz = clazz.getSuperclass();
}
if (result == null)
throw new NoSuchMethodException("Method " + methodName + "(..) not found in class " + objectClass.getName());
if (forceAccess)
result.setAccessible(true);
return result;
}
/**
* Return the Method object corresponding to the specified method name and parameters.
*
* @deprecated Use {@link #getMethod(Class, String, boolean, Class...)} instead.
*/
@Deprecated
public static Method getMethod(Object object, String methodName, boolean forceAccess, Class<?>... parameterTypes)
throws SecurityException, NoSuchMethodException
{
return getMethod(object.getClass(), methodName, forceAccess, parameterTypes);
}
/**
* Invoke the method of <code>object</code> corresponding to the specified name and with
* specified parameters values.
*/
public static Object invokeMethod(Object object, String methodName, boolean forceAccess, Object... args)
throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
final Class<?>[] parameterTypes = new Class<?>[args.length];
// build parameter types
for (int i = 0; i < args.length; i++)
parameterTypes[i] = args[i].getClass();
// get method
final Method method = getMethod(object, methodName, forceAccess, parameterTypes);
// invoke method
return method.invoke(object, args);
}
/**
* Return the Field object corresponding to the specified field name.
*/
public static Field getField(Class<?> objectClass, String fieldName, boolean forceAccess) throws SecurityException,
NoSuchFieldException
{
Class<?> clazz = objectClass;
Field result = null;
while ((clazz != null) && (result == null))
{
try
{
result = clazz.getDeclaredField(fieldName);
}
catch (NoSuchFieldException e)
{
// ignore
}
clazz = clazz.getSuperclass();
}
if (result == null)
throw new NoSuchFieldException(" Field " + fieldName + " not found in class " + objectClass.getName());
if (forceAccess)
result.setAccessible(true);
return result;
}
/**
* Return the Field object corresponding to the specified field name.
*
* @deprecated Use {@link #getField(Class, String, boolean)} instead.
*/
@Deprecated
public static Field getField(Object object, String fieldName, boolean forceAccess) throws SecurityException,
NoSuchFieldException
{
return getField(object.getClass(), fieldName, forceAccess);
}
/**
* Return the object instance corresponding to the specified field name.
*/
public static Object getFieldObject(Object object, String fieldName, boolean forceAccess)
throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException
{
return getField(object.getClass(), fieldName, forceAccess).get(object);
}
}