populace 发表于 2015-07-20 11:09

JAVA反射工具类

鉴于android的源码隐藏了部分关键方法不给使用,所以去查了反射机制写了这个工具类。
使用方法:直接调用invoke方法即可。其他的方法应该用不上。

代码package com.linin.utils;

import java.lang.reflect.Method;

/**
* 反射工具
*
* @author linin
*/
public class ReflectUtil {

    /**
   * 根据对象,返回一个class对象,用于获取方法
   */
    public static Class<?> getClass(Object obj) {
      try {
            return Class.forName(obj.getClass().getName());
      } catch (Exception e) {
            e.printStackTrace();
            return null;
      }
    }

    /**
   * 根据对象,获取某个方法
   *
   * @param obj
   *            对象
   * @param methodName
   *            方法名
   * @param parameterTypes
   *            该方法需传的参数类型,如果不需传参,则不传
   */
    public static Method getMethod(Object obj, String methodName,
            Class<?>... parameterTypes) {
      try {
            Method method = getClass(obj).getDeclaredMethod(methodName,
                  parameterTypes);
            method.setAccessible(true);
            return method;
      } catch (Exception e) {
            e.printStackTrace();
            return null;
      }
    }

    public static Method getMethod(Class<?> cls, String methodName,
            Class<?>... parameterTypes) {
      try {
            Method method = cls.getDeclaredMethod(methodName, parameterTypes);
            method.setAccessible(true);
            return method;
      } catch (Exception e) {
            e.printStackTrace();
            return null;
      }
    }

    /**
   * 直接传入对象、方法名、参数,即可使用该对象的隐藏方法
   *
   * @param obj
   * @param methodName
   * @param parameter
   */
    public static Object invoke(Object obj, String methodName,
            Object... parameter) {
      Class<?>[] parameterTypes = new Class<?>;
      for (int i = 0; i < parameterTypes.length; i++) {
            parameterTypes = parameter.getClass();
      }
      try {
            return getMethod(obj, methodName, parameterTypes).invoke(obj,
                  parameter);
      } catch (Exception e) {
            e.printStackTrace();
            return null;
      }
    }

    /**
   * 直接传入类名、方法名、参数,即可使用该对象的隐藏静态方法
   *
   * @param cls
   * @param methodName
   * @param parameter
   */
    public static Object invoke(Class<?> cls, String methodName,
            Object... parameter) {
      Class<?>[] parameterTypes = new Class<?>;
      for (int i = 0; i < parameterTypes.length; i++) {
            parameterTypes = parameter.getClass();
      }
      try {
            return getMethod(cls, methodName, parameterTypes).invoke(null,
                  parameter);
      } catch (Exception e) {
            e.printStackTrace();
            return null;
      }
    }

}

renxiao2003 发表于 2015-08-12 11:45

不错,把Java反射常用的方式集中起来了。
页: [1]
查看完整版本: JAVA反射工具类