反射

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);              //对变量赋值

你可能感兴趣的:(反射)