反射

作者: Kevin_Lv | 来源:发表于2019-10-17 16:19 被阅读0次

反射机制

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

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

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();
————————————————
版权声明:本文为CSDN博主「刘镓旗」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yulong0809/article/details/56842027

相关文章

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 镜面反射矩阵的推导

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

  • Java反射与joor反射库的使用

    java原生反射的使用 反射构造对象 反射方法 反射字段 joor反射库的使用 github:https://gi...

  • Java反射

    什么是反射? 反射的作用? 反射性能优化?

  • 反射三定律

    反射第一定律:反射可以将interface类型变量转换成反射对象 反射第二定律:反射可以将反射对象还原成inter...

  • 反射

    1.反射是什么?反射的定义,概念 2.为什么要学反射? 3.怎么使用反射?反射的使用

  • 一周岁前做好两件事,孩子就不会语言迟缓,保证口齿伶俐

    与语言发展相关的原始反射有四个:张口反射、足跖反射、抓握反射和手拉反射,每个反射的发生、发展和整合都是次第进行的,...

  • 面试官问go反射第一弹

    目录 反射概念 reflect包 反射类型(Type)和种类(Kind) 反射类型(Type)使用 反射类型对象(...

网友评论

      本文标题:反射

      本文链接:https://www.haomeiwen.com/subject/ohhvmctx.html