jdk5.0新特性—— 反射

目录
    1、反射的原理
    2、使用反射操作类里面的构造方法(有参、无参构造方法)
    3、使用反射操作 属性
    4、使用反射操作 普通方法
    5、使用反射操作 静态方法
=======================================================
1、反射的原理(********深刻理解********)
    * 应用在一些通用性比较高的代码中
    * 后面学到的框架,大多数都是使用反射来实现的

    * 在框架开发中,都是基于配置文件开发
    ** 在配置文件中配置了类,可以通过反射得到类中的 所有内容,可以让类中的某个方法来执行

    * 类中的所有内容:属性、无参构造、有参构造、普通方法

    * 反射的原理:
        (1)首先需要把java文件保存到本地硬盘 .java
        (2)编译java文件,变成 .class字节码文件
        (3)jvm通过 类加载器 把 .class文件 加载到内存中使用Class类表示
   ================================================================
    * 当使用反射时候,首先需要获取到Class类,得到了这个类之后,就可以得到class文件里面的所有内容
        包含属性、构造方法、普通方法
        * 属性通过一个类 Filed
        * 构造方法通过一个类 Constructor
        * 普通方法通过一个类 Method

2、使用反射操作 构造方法(***会写***)
    首先获取到Class类
    // 获取Class类的三种方法:
    Class clazz1 = Person.class;
    Class clazz2 = new Person().getClass();
    Class clazz3 = Class.forName("cn.itcast.test09.Person");

    需求: 要对一个类进行实例化,可以new,不使用new,怎么获取?
    代码:
        //操作无参数的构造方法
        public void test1() throws Exception {
            //得到Class
            Class c1 = Class.forName("cn.itcast.test09.Person");
            //得到Person类的实例
            Person p = (Person) c1.newInstance();
            //设置值
            p.setName("zhangsan");
            System.out.println(p.getName());
        }
    ====================================================
        //操作有参数的构造方法
        public void test2() throws Exception {
            //得到Class
            Class c2 = Class.forName("cn.itcast.test09.Person");
            //传递是有参数的构造方法里面参数类型,类型使用class形式传递
            Constructor cons = c2.getConstructor(Integer.class,String.class);
            //通过有参数的构造方法设置值,并返回Person实例
            Person p1 = (Person) cons.newInstance(100,"lisi");
            System.out.println(p1.getId()+" "+p1.getName());
        }

3、使用反射操作 属性(**会写**)
    使用 Field类 表示普通方法
    //操作name属性
    @Test
    public void test3() throws Exception {
        //得到Class类
        Class c3 = Class.forName("cn.itcast.test09.Person");
        //得到Person类的实例
        Person person = (Person) c3.newInstance();
        //通过这个方法得到属性,参数是属性的名称
        Field f1 = c3.getDeclaredField("name");
        //操作的是私有的属性,不让操作,需要设置可以操作私有属性setAccessible(true),可以操作私有属性
        f1.setAccessible(true);
        //设置name值 set方法,两个参数:第一个参数类的实例,第二个参数是设置的值
        f1.set(person, "wangwu"); //相当于 在 person.name = "wangwu";
        System.out.println(f1.get(person)); //相当于 person.getName()
        System.out.println(person.getName());
    }

4、使用反射操作 普通方法(**会写**)
    使用 Method类 表示普通方法
    //操作普通方法 ,比如操作 setName
    @Test
    public void test4() throws Exception {
        //得到Class类
        Class c4 = Class.forName("cn.itcast.test09.Person");
        //得到Person实例
        Person p4 = (Person) c4.newInstance();
        //传递两个参数:第一个参数,方法名称;第二个参数,方法里面参数的类型
        Method m1 = c4.getDeclaredMethod("setName", String.class);
        //操作的私有的方法 ,需要设置值是true
        //m1.setAccessible(true);
        //让setName方法执行 ,执行设置值
        //使用invoke(p4, "zhangsan");传递两个参数:第一个参数,person实例;第二个参数,设置的值
        //执行了invoke方法之后,相当于,执行了setName方法,同时通过这个方法设置了一个值是 zhangsan
        m1.invoke(p4, "zhangsan");
        System.out.println(p4.getName());
    }

5、使用反射操作 静态方法(**会写**)
    注:
    * 当操作的方法是静态的方法时候,因为静态方法调用方式是:类名.方法名,不需要类的实例
    * 使用反射操作静态方式时候,也是不需要实例
    * 在invokie方法的第一个参数里面,写一个 null
        - m1.invoke(null, "niuqi");
    例如:
        public class Person {
            public static void testDemo(String name){
                System.out.println("这是静态方法,参数是:"+name);
            }
        }
        =============================================
        @Test
        public void test5() throws Exception {
            Class c5 = Class.forName("com.zzq.Person");
            Method m1 = c5.getDeclaredMethod("testDemo",String.class);
            m1.invoke(null, "hello");
        }
    静态方法随着类一同加载,故不需要调用,随类一同执行。

猜你喜欢

转载自blog.csdn.net/weixin_42472048/article/details/81515957
今日推荐