黑马程序员技术交流社区

标题: 22 [打印本页]

作者: 祝小康    时间: 2019-6-6 15:06
标题: 22

字节码文件获取的三种方式
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);




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2