1.什么是反射

       Java反射机制就是在程序运行的时候,动态的去获取并调用任意一个类的属性、方法的机制

        通过反射获取到的各种信息会在java中映射成一个个单独的类,如属性对应的类(Field),方法对应的类(Method),构造对应的类(Constructo)等等,而我们就可以通过这些类来对反射中获取的数据进行操作

2.为什么需要反射

        Java是先编译再运行的语言,程序中的对象在编译期就固定了,但是在程序运行时可能需要动态加载某些类,而这些类在编译前没有使用,所以加载不到JVM里。这时我们就可以通过反射,在运行时动态地创建对象

        增加程序的灵活性,避免写死,解耦

        比如说有类A以及类B,某段程序需要的对象实例不确定,有时候需要A,有时候需要B,我们不可能每次去修改代码,这时就可以通过反射,去实现动态的根据需求创建不同的实例

3.反射怎么运用

对反射的调用是通过Class类中的方法实现的.所以我们先要获取到每一个字节码文件对应的Class类型的对象.

Class又是什么呢?

我们的.class文件通过类加载机制加载到内存种,在内存中这个字节码会被描述成Class类对象

获取Class对象有三种方式

这里要注意,每一个类只会有一个Class,重复创建也只会获取到同一个,获取到Class之后进行比较,可以得到全是true

//方式一:Class.forName("绝对路径");
Class class1 = Class.forName("com.zc.test");   //test是要获取的类,自定义
System.out.println("class1 = " + class1);

//方式二:类名.class
Class class2 = test.class;
System.out.println("class2 = " + class2);

//方式三:对象.getClass();
test test = new test();
Class class3 = test.getClass();
System.out.println("class3 = " + class3);

//比较三个对象
System.out.println(class1 == class2);//返回true
System.out.println(class1 == class3);//返回true

推荐使用第一种方式Class.forName("xx.xx.xx")

第二种需要导入要获取的类的包,依赖性较高

第三种都已经自己new了,反射略显多余

通过Class进行操作(只是一些常用比较简单的)

public static void main(String[] args) throws Exception {
        text text=new text();
        Class class1 = text.getClass();

//对变量的操作
        //获取所有成员变量
        Field[] fields = class1.getFields();
        //获取指定名称的成员变量
        Field name = class1.getField("属性名");
        //获取成员变量name的值
        Object value = name.get(text);
        //修改ame的值
        name.set(text, "张三");
        System.out.println(text.name);//此时name就被修改成张三了




//对构造的操作
        //获取无参构造
        Constructor con = class1.getConstructor();
        //通过无参构造创建实例对象
        Object p1 = con.newInstance();
        //获取有参
        Object p2 = con.newInstance("xxx","xxx");
        //获取所有构造方法
        Constructor[] con2 = class1.getConstructors();



//对方法的操作
        //获取无参方法
        Method method = class1.getMethod("方法名");
        //执行获取到的无参方法
        method.invoke(text);

        //获取有参方法
        Method method1 = class1.getMethod("方法名", String.class);//第二个参数是方法参数的数据类型.class
        //执行获取到的有参方法
        method1.invoke(text, "张三"); //第二参数是被调用方法要用的参数

        //获取 public 修饰的所有方法
        Method[] methods = class1.getMethods();
        for (Method methods1 : methods) {
            //获取方法名
            System.out.println(method.getName());
        }

    }

#自行总结编写,有错谅解,提示修改,不喜勿喷

###记得三连哦~