A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

祝小康

初级黑马

  • 黑马币:35

  • 帖子:12

  • 精华:0

© 祝小康 初级黑马   /  2019-6-6 15:06  /  1026 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


字节码文件获取的三种方式
1.        对象名.getCalss();                 
2.        类名.class                        
3.        Class.forName("全类名");        


1        通过无参构造创建Person类的对象        
        Class clazz = Class.forName("com.heima.bean.Person");        //先要获取字节码文件的对象
        Person p = (Person) clazz.newInstance();                                //通过无参构造创建对象
        以上的两行代码等同于
        Person p = new Person();


2        通过有参构造创建Person类的对象
        Class clazz = Class.forName("com.heima.bean.Person");        //先要获取字节码文件的对象
        Constructor c = clazz.getConstructor(String.class,int.class);//通过这个字节码文件的对象,来获取有参构造
        Person p = (Person) c.newInstance("张三",23);                                                //通过有参构造创建对象
        
        以上三行代码等同于
        Person p = new Person("张三",23);

        用Constructor通过无参构造创建对象
        Class clazz = Class.forName("com.itheima_01_bean.Bean");
        Constructor cons = clazz.getConstructor();
        Object obj = cons.newInstance();

        

3        利用反射修改属性值
        Class clazz = Class.forName("com.heima.bean.Person");                        //先去获取这个类的字节码文件的对象
        Constructor c = clazz.getConstructor(String.class,int.class);        //获取有参构造
        Person p = (Person) c.newInstance("张三",23);                                        //通过有参构造创建对象
        //通过反射的方式得到Person的对象        
        Field f = clazz.getField("name");                                                                //获取姓名字段
        f.set(p, "李四");        


4        利用反射修改属性值(暴力反射)
        Class clazz = Class.forName("com.heima.bean.Person");                        //先去获取这个类的字节码文件的对象
        Constructor c = clazz.getConstructor(String.class,int.class);        //获取有参构造
        Person p = (Person) c.newInstance("张三",23);                                        //通过有参构造创建对象
        //通过反射的方式得到Person的对象
        Field f = clazz.getDeclaredField("name");                                                //暴力反射获取字段
        f.setAccessible(true);                                                                                        //去除私有权限
        f.set(p, "李四");                                                                                                //修改p对象中的值。



5        利用反射运行一个方法。

        Class clazz = Class.forName("com.heima.bean.Person");
        Constructor c = clazz.getConstructor(String.class,int.class);        //获取有参构造
        Person p = (Person) c.newInstance("张三",23);                                        //通过有参构造创建对象        
        Method m = clazz.getMethod("eat");                                                                //获取eat方法
        m.invoke(p);                                                                                                        //运行这个方法
        //p.eat();//就相当于我们平时写的这样的效果。        
        Method m2 = clazz.getMethod("eat", int.class);                                        //获取有参的eat方法
        m2.invoke(p, 10);

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马