/* See LICENSE for licensing and NOTICE for copyright. */ package org.cryptacular.util; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; /** * Reflection utilities. * * @author Middleware Services */ public final class ReflectUtil { /** Method cache. */ private static final Map<String, Method> METHOD_CACHE = new HashMap<>(); /** Private constructor of utility class. */ private ReflectUtil() {} /** * Gets the method defined on the target class. The method is cached to speed up subsequent lookups. * * @param target Target class that contains method. * @param name Method name. * @param parameters Method parameters. * * @return Method if found, otherwise null. */ public static Method getMethod(final Class<?> target, final String name, final Class<?>... parameters) { final String key = target.getName() + '.' + name; Method method = METHOD_CACHE.get(key); if (method != null) { return method; } try { method = target.getMethod(name, parameters); METHOD_CACHE.put(key, method); return method; } catch (NoSuchMethodException e) { return null; } } /** * Invokes the method on the target object with the given parameters. * * @param target Target class that contains method. * @param method Method to invoke on target. * @param parameters Method parameters. * * @return Method return value. A void method returns null. */ public static Object invoke(final Object target, final Method method, final Object... parameters) { try { return method.invoke(target, parameters); } catch (Exception e) { throw new RuntimeException("Failed invoking " + method, e); } } }