黑马程序员技术交流社区

标题: 【南京校区】反射的使用 [打印本页]

作者: 大蓝鲸Java    时间: 2019-3-29 11:12
标题: 【南京校区】反射的使用
反射的使用
反射获取字节码文件对象的三种方式:
       
[AppleScript] 纯文本查看 复制代码
1,Class clazz1 = Bean.class; // 类名.class

        2,Class clazz2 = bean.getClass();//对象名.getClass()

        3,Class.forName("全类名");//包名 + 类名



1        通过无参构造创建Person类的对象        //快速生成
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.heima.bean.Person");        //先要获取字节码文件的对象

        Person p = (Person) clazz.newInstance();                                //通过无参构造创建对象


2        通过有参构造创建Person类的对象
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.heima.bean.Person");        //先要获取字节码文件的对象

        Constructor c = clazz.getConstructor(String.class,int.class);//通过这个字节码文件的对象,来获取有参构造

        Person p = (Person) c.newInstance("张三",23);                                                //通过有参构造创建对象

        通过无参构造创建对象
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.itheima_01_bean.Bean");

        Constructor cons = clazz.getConstructor();

        Object obj = cons.newInstance();

3        暴力反射私有构造方法
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.itheima_01_bean.Bean");//获得Class对象 

        Constructor cons = clazz.getDeclaredConstructor(String.class ,String.class);//获得私有构造

        cons.setAccessible(true);//改变私有权限

        Object obj = cons.newInstance("b001","名称");//创建对象并赋值



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

[AppleScript] 纯文本查看 复制代码
        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);



5        利用暴力反射运行一个私有的方法。
       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.itheima_01_bean.Bean"); 

        Object obj = clazz.newInstance();                                                                //获得实例

        Method method = clazz.getDeclaredMethod("show", int.class);                //获得方法

        method.setAccessible(true);                                                                                //改变私有权限

        Object r = method.invoke(obj, 18);                                                                //执行方法


6        反射静态方法

       
[AppleScript] 纯文本查看 复制代码
Class clazz = Class.forName("com.itheima_01_bean.Bean");                //1 获得Class对象

        Method method = clazz.getMethod("main", String[].class);        //2获得main方法

        String[] args = {"abc","123","xxx"};

        //method.invoke(null, args);                 //错误写法

        // * 数组参数需要特殊处理

        // ** 方式1:将 String[]转换成Object,可变参数将不处理数组

        method.invoke(null, (Object)args);                                                                //3 执行main方法

                                                                                                                                        //因为是静态方法,所以此处不需要传对象

        // ** 方法2:将提供二维数组,args将作为二维数组的第一个数。

        method.invoke(null, new Object[] {args});


7        利用反射修改属性值
       
[AppleScript] 纯文本查看 复制代码
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, "李四");       


8        利用反射修改属性值(暴力反射)
       
[AppleScript] 纯文本查看 复制代码
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对象中的值。







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