JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

在android中Google很多的类的某些方法不让第三方应用去调用,通过java反射机制能把这些隐藏方法获取出来并调用

相关的API

1.实例化Class对象,有三种方式,
        Class.forName(类名全路径); //通过Class的静态方法
        对象.getClass() //通过对象.getClass方法
        int.class //基本数据类型及基本数据类型的封装了,例如Integer

    2.获取父类
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法
        Class<?> superclass = clazz.getSuperclass();

    3.获取实现接口
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法
        Class<?>[] interfaces = clazz.getInterfaces()


    4.获取指定参数构造函数及实例化
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法
        Constructor<?> constructor = clazz.getConstructor(Class<?>  ... class);//获取公共的
        Constructor<?> constructor = clazz.getDeclaredConstructor()//获取私有的
        constructor.newInstance(Object args);

    5.获取所有构造函数及构造参数的类型
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法
        Constructor<?>[] constructors = clazz.getConstructors();//公共的
        Constructor<?>[] constructors = clazz.getDeclaredConstructors()//包括私有的

         for (int i = 0; i < constructors.length; i++) {
            Class<?> clazzs[] = constructors[i].getParameterTypes();//获取类型
            System.out.print("constructors[" + i + "] (");
            for (int j = 0; j < clazzs.length; j++) {
                if (j == clazzs.length - 1)
                    System.out.print(clazzs[j].getName());
                else
                    System.out.print(clazzs[j].getName() + ",");
            }
            System.out.println(")");
        }


    6.通过无参实例化对象
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法          
        class.newInstance();



    7.获取字段,修改字段
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法          

        Field field = clazz.getField(String name);//获取公共字段
        Field field = clazz.getDeclaredField(String name);//获取私有公共字段
        Field[] field = clazz.getFields();//获取所有公共字段
        Field[] field = clazz.getDeclaredFields();//获取包括私有所有字段

        Field field = clazz.getDeclaredField("heihei");
        field.setAccessible(true);//设置java取消访问检查,也就是说如果是私有的也可以访问,
        field.set(obj, "Java反射机制");

    8.获取方法,运行方法
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法          

        clazz.getMethod(String name ,Class<?> ... parame);//获取公共指定方法
        clazz.getDeclaredMethod(String name ,Class<?> ... parame)//获取私有指定方法
        clazz.getMethods()//获取公共所有方法
        clazz.getDeclaredMethods();//获取包括私有全部方法

        Method method = clazz.getMethod("add");
        method.invoke(clazz.newInstance());

        method = clazz.getMethod("getInfo", int.class, String.class);
        method.setAccessible(true)//设置java取消访问检查,也就是说如果是私有的也可以访问,
        method.invoke(clazz.newInstance(), 20, "张三");


    9.获取数组或者list中的类型,如果不是数组或集合返回null
        Class<?> clazz  = Class.forName(类名全路径); //通过Class的静态方法  
        Class<?> componentType = clazz.getComponentType();