java 反射


前言

        反射是一切框架的基础,当需要在程序运行时获取对象的构造函数、属性、方法时需要用到反射。

反射的三种方式

     三种方式比较起来常用第三种

    1.1 Student student=new Student();

          Class clazz=student.getClass();

    1.2  Class clazz=Class.forName("com.zhangfei.Student");

    1.3  Class clazz=Student.class; 

反射获取构造函数

      Class clazz=Class.forName("com.zhangfei.Student");


            Constructor[] cons=clazz.getConstructors();
            System.out.println("获取公共的构造函数=========");
            for(Constructor con:cons){
                System.out.println(con);
            }

            System.out.println("获取所有的构造函数,包括共有,私有、受保护的=========");
            cons=clazz.getDeclaredConstructors();
            for(Constructor con:cons){
                System.out.println(con);
            }

            System.out.println("1、调用公共构造函数创建一个对象========");
            Constructor constructor=clazz.getConstructor(null);
            Student student=(Student) constructor.newInstance();


            System.out.println("2、调用包含一个参数的公共构造函数创建一个对象=========");
            constructor=clazz.getConstructor(String.class);
            student=(Student)constructor.newInstance("zhangfei");

反射获取属性

        Field[] fields=clazz.getFields();
            System.out.println("3、获取共有属性=======");
            for(Field f:fields){
                System.out.println(f);
            }


            fields=clazz.getDeclaredFields();
            System.out.println("4、获取所有属性包括共有、私有、受保护的=======");
            for(Field f:fields){
                System.out.println(f);
            }


            System.out.println("5、给私有属性name赋值:=========");
            Field field=clazz.getDeclaredField("id");
            field.setAccessible(true);
            field.set(student,1);

            Field field2=clazz.getDeclaredField("name");
            field2.setAccessible(true);
            field2.set(student,"zhangfei");

            Field field3=clazz.getDeclaredField("age");
            field3.setAccessible(true);
            field3.set(student,30);

            System.out.println(student.toString());

反射获取方法

       这里获取共有方法时会把继承自object对象的方法也获取到。



       System.out.println("6、获取公有方法===============");
            Method[] methods=clazz.getMethods();
            for(Method method:methods){
                System.out.println(method);
            }


            System.out.println("7、获取所有方法,包括公有、私有、受保护的方法========");
            methods=clazz.getDeclaredMethods();
            for(Method method:methods){
                System.out.println(method);
            }

            System.out.println("8、调用共有方法并调用=======");
            Method method=clazz.getMethod("show1");
            method.setAccessible(true);
            method.invoke(student);


            System.out.println("9、调用受保护的方法并且传参=======");
            method=clazz.getDeclaredMethod("show2",String.class);
            method.setAccessible(true);
            method.invoke(student,"zhangfei");