All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.extcos.util.ReflectionUtils Maven / Gradle / Ivy

package net.sf.extcos.util;

import static net.sf.extcos.util.Assert.iae;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class ReflectionUtils {
	private ReflectionUtils() {
	} // so it can't be instantiated

	/**
	 * Get the field represented by the supplied {@link Field field object} on the
	 * specified {@link Object target object}. In accordance with {@link Field#get(Object)}
	 * semantics, the returned value is automatically wrapped if the underlying field
	 * has a primitive type.
	 * 

Thrown exceptions are handled via a call to {@link #handleReflectionException(Exception)}. * @param field the field to get * @param target the target object from which to get the field * @return the field's current value */ public static Object getField(Field field, Object target) { try { return field.get(target); } catch (IllegalAccessException ex) { handleReflectionException(ex); throw new IllegalStateException( "Unexpected reflection exception - " + ex.getClass().getName() + ": " + ex.getMessage()); } } /** * Attempt to find a {@link Field field} on the supplied {@link Class} with the * supplied name. Searches all superclasses up to {@link Object}. * @param clazz the class to introspect * @param name the name of the field * @return the corresponding Field object, or null if not found */ public static Field findField(Class clazz, String name) { return findField(clazz, name, null); } /** * Attempt to find a {@link Field field} on the supplied {@link Class} with the * supplied name and/or {@link Class type}. Searches all superclasses * up to {@link Object}. * @param clazz the class to introspect * @param name the name of the field (may be null if type is specified) * @param type the type of the field (may be null if name is specified) * @return the corresponding Field object, or null if not found */ public static Field findField(Class clazz, String name, Class type) { Assert.notNull(clazz, iae(), "Class must not be null"); Assert.isTrue(name != null || type != null, iae(), "Either name or type of the field must be specified"); Class searchType = clazz; while (!Object.class.equals(searchType) && searchType != null) { Field[] fields = searchType.getDeclaredFields(); for (Field field : fields) { if ((name == null || name.equals(field.getName())) && (type == null || type.equals(field.getType()))) { return field; } } searchType = searchType.getSuperclass(); } return null; } /** * Attempt to find a {@link Method} on the supplied class with the supplied name * and parameter types. Searches all superclasses up to Object. *

Returns null if no {@link Method} can be found. * @param clazz the class to introspect * @param name the name of the method * @param paramTypes the parameter types of the method * (may be null to indicate any signature) * @return the Method object, or null if none found */ public static Method findMethod(Class clazz, String name, Class... paramTypes) { Assert.notNull(clazz, iae(), "Class must not be null"); Assert.notNull(name, iae(), "Method name must not be null"); Class searchType = clazz; while (searchType != null) { Method[] methods = (searchType.isInterface() ? searchType.getMethods() : searchType.getDeclaredMethods()); for (Method method : methods) { if (name.equals(method.getName()) && (paramTypes == null || Arrays.equals(paramTypes, method.getParameterTypes()))) { return method; } } searchType = searchType.getSuperclass(); } return null; } /** * Invoke the specified {@link Method} against the supplied target object with no arguments. * The target object can be null when invoking a static {@link Method}. *

Thrown exceptions are handled via a call to {@link #handleReflectionException}. * @param method the method to invoke * @param target the target object to invoke the method on * @return the invocation result, if any * @see #invokeMethod(java.lang.reflect.Method, Object, Object[]) */ public static Object invokeMethod(Method method, Object target) { return invokeMethod(method, target, new Object[0]); } /** * Invoke the specified {@link Method} against the supplied target object * with the supplied arguments. The target object can be null * when invoking a static {@link Method}. *

* Thrown exceptions are handled via a call to * {@link #handleReflectionException}. * * @param method * the method to invoke * @param target * the target object to invoke the method on * @param args * the invocation arguments (may be null) * @return the invocation result, if any */ public static Object invokeMethod(Method method, Object target, Object[] args) { try { return method.invoke(target, args); } catch (Exception ex) { handleReflectionException(ex); } throw new IllegalStateException("Should never get here"); } /** * Handle the given reflection exception. Should only be called if no * checked exception is expected to be thrown by the target method. *

* Throws the underlying RuntimeException or Error in case of an * InvocationTargetException with such a root cause. Throws an * IllegalStateException with an appropriate message else. * * @param ex * the reflection exception to handle */ public static void handleReflectionException(Exception ex) { if (ex instanceof NoSuchMethodException) { throw new IllegalStateException("Method not found: " + ex.getMessage()); } if (ex instanceof IllegalAccessException) { throw new IllegalStateException("Could not access method: " + ex.getMessage()); } if (ex instanceof InvocationTargetException) { handleInvocationTargetException((InvocationTargetException) ex); } if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } handleUnexpectedException(ex); } /** * Handle the given invocation target exception. Should only be called if no * checked exception is expected to be thrown by the target method. *

* Throws the underlying RuntimeException or Error in case of such a root * cause. Throws an IllegalStateException else. * * @param ex * the invocation target exception to handle */ public static void handleInvocationTargetException( InvocationTargetException ex) { rethrowRuntimeException(ex.getTargetException()); } /** * Rethrow the given {@link Throwable exception}, which is presumably the * target exception of an {@link InvocationTargetException}. Should * only be called if no checked exception is expected to be thrown by the * target method. *

* Rethrows the underlying exception cast to an {@link RuntimeException} or * {@link Error} if appropriate; otherwise, throws an * {@link IllegalStateException}. * * @param ex * the exception to rethrow * @throws RuntimeException * the rethrown exception */ public static void rethrowRuntimeException(Throwable ex) { if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } if (ex instanceof Error) { throw (Error) ex; } handleUnexpectedException(ex); } /** * Throws an IllegalStateException with the given exception as root cause. * * @param ex * the unexpected exception */ private static void handleUnexpectedException(Throwable ex) { // Needs to avoid the chained constructor for JDK 1.4 compatibility. IllegalStateException isex = new IllegalStateException( "Unexpected exception thrown"); isex.initCause(ex); throw isex; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy