反射

java中反射是通过一定的条件得到类对象然后进行各种操作的过程;

反射有可以分为几个层次;

1 得到类对象

2. 得到构造方法

3. 得到属性

4. 得到方法

## 反射(重要)

    重要的关键字的关键字

        Class              //获得类对象,大前提

            Constructor    //获得类中的构造方法,二前提

                Method    //获得类中的方法

                    invoke  //对获得到的方法传参

                Filed      //获得类中的变量

                    set    //对获得到的变量进行设置

    1. 获得类对象  (关键字Class) 

        三种方法


        1)通过包名获取

            Class cls1 = Class.forName("com.reflect.Person");  //括号里面是包名,具体到类,Person是一个类名


        2)通过类名获取

            Class cls2 = Person.Class;


        3) 通过一个构造方法获取

            Class cls3 = new Person(1, "小美").getClass();      //Person(1, "小美")  是Person类的一个有参的构造方法


    2. 获得构造方法(关键字 Constructor)


        先找到类对象:

            Class cls = Class.forName("com.reflect.Person");


        //获得多个构造方法

        1)  获取所有非私有化的构造方法

            Constructor[] constructors = cls.getConstructors();


        2) 获得所有构造方法(包括私有和非私有)

            Constructor allConstructs = cls.getDeclaredConstructors();


        //获得指定构造方法,非私有

        3) Constructor aConstructor = cls.getConstructor(int.class, String,class);  //括号里边是获得构造方法需传入的参数类型

            (1)利用获得到的构造方法创造一个新的对象

                Person p = (Person) aConstructor.newInstance(1, "妹子");

                    p.sleep();

                    p.game();


        获得私有化的构造方法

        4) Constructor privateConstructor = cls.getDeclaredConstructor(null);    //这是一个无参的构造方法

            (1) 用得到的构造方法创造对象,需要授权

                privateConstructor.setAccessible(true);

                Person p2 = (Person) privateConstructor.newInstance(null);

                p2.setId(3);

                p2.setName("小媚");


    3. 获得成员方法(关键字 Method)

        首先创建类对象

            Class cls = Class.forName("com.reflect.Person");


        获得所有方法:


        1) 获得所有方法(非私有,同时会获取到父类的方法)

            Method[] allMethod = cls.getMethods();


        2) 暴力方式获得所有方法(包括私有和非私有,会过滤掉父类的方法)

            Method[] allMethods = cls.getDeclareMethods();


        获得指定方法:

            Person aPerson = (Person) cls.getConstructor(int.class, String.class).newInstance(1, "小花");


        3) 获取一个指定的普通公共方法:

            Method aMethod = cls.getMethod("test", int.class);          //  "test" 是指定方法的方法名, int.class 是使用方法需传入参数的类型

            aMethod.invoke(aPerson, 6);                //对参数进行设置


        4) 获取一个静态的方法

            Method aStaticMethod = cls.getMethod("ear", null);          //  null代表此方法不需要传入任何参数

            aStaticMethod.invoke(null, null);                      // 因为没有任何参数,所有不需要设置值


        5) 用暴力方法获取一个私有化方法

            Method aPrivateMethod = cls.getDeclaredMethod("testPrivate", null);        //私有化不需要传入参数所以是null

            aPrivateMethod.getAccessible(true);                    //给方法授权

            aPrivateMethod.invoke(aPerson, null);              //给私有化设置值


    4. 获得成员变量

        首先创建类对象

            Class cls = Class.forName("com.reflect.Person");


        获得所有变量:

        1) 获得所有变量(非私有)

            Field[] aField = cls.getFields();


        2) 暴力方法,获得所有变量(包括私有和非私有)

            File[] aFileds = cls.getDeclaredFields();


        3) 获得指定变量(非私有)

            Field aPublicField = cls.getField("test");          //括号内是指定变量的变量名


            aPublicField.set(aPerson, 5);                  //对获得到的变量赋值

            System.out.println(aPerson.test);              //变量的使用方法


        4) 暴力方法,获得私有化变量

            Field aPrivateField = cls.getDeclaredfField("id");     

            aPrivateField.setAccessible(true);          //对变量重新赋值之前需要对变量授权

            aPrivateField.set(aPerson, 8);              //对变量赋值

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 学习Android的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Android学习交流群...
    kingZXY2009阅读 2,586评论 0 0
  • 前言,本来只是想研究一下注解的,不过发现,要懂注解先得懂反射,别问我为什么,你可以自己试试 JAVA反射 主要是指...
    justCode_阅读 4,943评论 2 9
  • 获取反射类的三种方法: 1. Class.forName("类所在的包和类名"); Class class1 = ...
    YaphetS081阅读 2,773评论 0 0
  • Java反射机制 前言 网页版的jdk的API离线版API 什么是反射机制 反射是java语言的一个特性,它允程序...
    爱撒谎的男孩阅读 2,828评论 0 3
  • 当我们做错事情的时候不应该去埋怨别人或是给自己找一些借口,首先我们要从自身找原因,改变不了她人,可以改变自己!
    Ding欣欣阅读 1,531评论 0 2

友情链接更多精彩内容