JAVAWeb——反射的原理

* 后面学到的框架,大多数都是使用反射来实现的

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

 

 1.反射的原理:

        * 首先需要把java文件保存到本地硬盘 .java
        * 编译java文件,成.class文件
        * 使用jvm,把class文件通过类加载加载到内存中
        * 万事万物都是对象,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,怎么获取?
        - //得到Class
        Class c3 = Class.forName("cn.itcast.test09.Person");
        //得到Person类的实例
        Person p = (Person) c3.newInstance();

    * 代码
    //操作无参数的构造方法
    @Test
    public void test1() throws Exception {
        //得到Class
        Class c3 = Class.forName("cn.itcast.test09.Person");
        //得到Person类的实例
        Person p = (Person) c3.newInstance();
        //设置值
        p.setName("zhangsan");
        System.out.println(p.getName());
    }
 

3.通过反射操作有参构造方法

    //操作有参数的构造方法
    @Test
    public void test2() throws Exception {
        //得到Class
        Class c1 = Class.forName("cn.itcast.test09.Person");
        //使用有参数的构造方法
        //c1.getConstructors();//获取所有的构造方法
        //传递是有参数的构造方法里面参数类型,类型使用class形式传递
        Constructor cs = c1.getConstructor(String.class,String.class);
        //通过有参数的构造方法设置值
        //通过有参数的构造方法创建Person实例
        Person p1 = (Person) cs.newInstance("lisi","100");
        System.out.println(p1.getId()+" "+p1.getName());
    }
4.通过反射操作属性

    @Test
    public void test3() {
        try {
            //得到Class类
            Class c2 = Class.forName("cn.itcast.test09.Person");
            //得到name属性
            //c2.getDeclaredFields();//表示得到所有的属性
            //得到Person类的实例
            Person p11 = (Person) c2.newInstance();
            //通过这个方法得到属性,参数是属性的名称
            Field f1 = c2.getDeclaredField("name");
            //操作的是私有的属性,不让操作,需要设置可以操作私有属性setAccessible(true),可以操作私有属性
            f1.setAccessible(true);
            //设置name值 set方法,两个参数:第一个参数类的实例,第二个参数是设置的值
            f1.set(p11, "wangwu"); //相当于 在 p.name = "wangwu";
            System.out.println(f1.get(p11)); //相当于 p.name
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

5.通过反射操作普通方法

       

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

    * 当操作的方法是静态的方法时候,因为静态方法调用方式是 类名.方法名,不需要类的实例
    * 使用反射操作静态方式时候,也是不需要实例
    * 在invokie方法的第一个参数里面,写一个 null
        - m1.invoke(null, "niuqi");

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值