package com.mopub.common.util; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class Reflection { public static class MethodBuilder { private final Object mInstance; private final String mMethodName; private Class<?> mClass; private List<Class<?>> mParameterClasses; private List<Object> mParameters; private boolean mIsAccessible; private boolean mIsStatic; public MethodBuilder(final Object instance, final String methodName) { mInstance = instance; mMethodName = methodName; mParameterClasses = new ArrayList<Class<?>>(); mParameters = new ArrayList<Object>(); mClass = (instance != null) ? instance.getClass() : null; } public <T> MethodBuilder addParam(Class<T> clazz, T parameter) { mParameterClasses.add(clazz); mParameters.add(parameter); return this; } public MethodBuilder setAccessible() { mIsAccessible = true; return this; } public MethodBuilder setStatic(Class<?> clazz) { mIsStatic = true; mClass = clazz; return this; } public Object execute() throws Exception { Class<?>[] classArray = new Class<?>[mParameterClasses.size()]; Class<?>[] parameterTypes = mParameterClasses.toArray(classArray); Method method = getDeclaredMethodWithTraversal(mClass, mMethodName, parameterTypes); if (mIsAccessible) { method.setAccessible(true); } Object[] parameters = mParameters.toArray(); if (mIsStatic) { return method.invoke(null, parameters); } else { return method.invoke(mInstance, parameters); } } } public static Method getDeclaredMethodWithTraversal(Class<?> clazz, String methodName, Class<?>... parameterTypes) throws NoSuchMethodException { Class<?> currentClass = clazz; while (currentClass != null) { try { return currentClass.getDeclaredMethod(methodName, parameterTypes); } catch (NoSuchMethodException e) { currentClass = currentClass.getSuperclass(); } } throw new NoSuchMethodException(); } public static boolean classFound(final String className) { try { Class.forName(className); return true; } catch (ClassNotFoundException e) { return false; } } }