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

© 路人丶 中级黑马   /  2017-12-24 21:43  /  2094 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天学习了反射,感觉很厉害,什么东西都能拿到,黑客必备神技啊!!!!
反射
一、反射机制的概述
        Java反射机制就是在运行状态下,动态地获取任意一个类的所有属性和方法,并且能够使用。
二、字节码对象获取
        a:类对象.getClass方法
                // 1.对象
                Student s = new Student();
                Class class1 = s.getClass();
        b:类名.class
                // 2.类名 .class
                Class class2 = Student.class;
        c:通过Class类中的静态方法, 指定字符串, 该字符串是类的全类名(包名+类名)
                // 3.全限定名 Class类的方法
                Class class3 = Class.forName("com.itheima.day13.Student");
三、反射获取构造方法
        a:空参构造
                //1.获取字节码对象
                Class clazz = Class.forName("com.itheima.day13.Student");
                //2.获取空参构造
                //2.1 空参方法特有
                Object obj1 = clazz.newInstance();
                //2.2 普通获取构造
                Constructor con = clazz.getConstructor();
                Object obj2 = con.newInstance();
        b:有参构造
                //1.获取字节码对象
                Class clazz = Class.forName("com.itheima.day13.Student");
                //2.获取有参构造
                Constructor con2 = clazz.getConstructor(String.class,int.class);
                Object obj3 = con2.newInstance("李四",24);
四、反射获取成员变量
        a:public 修饰
                //1.字节码对象
                Class clazz = Class.forName("com.itheima.day13.Student");
                //2.类对象
                Object obj = clazz.newInstance();
                //3.获取成员变量(age 年龄)  public
                Field f = clazz.getField("age");
                //获取值
                Object age1 = f.get(obj);
                //修改
                f.set(obj, 333);
        b:其它修饰符
                //1.字节码对象
                Class clazz = Class.forName("com.itheima.day13.Student");
                //暴力反射获取private修饰的  name属性
                Field f2 = clazz.getDeclaredField("name");
                //取消权限
                f2.setAccessible(true);
                //不能直接访问,必须取消权限
                f2.set(obj, "哈哈哈哈");
五、反射获取成员方法
                //1.
                Class clazz = Class.forName("com.itheima.day13.Student");
                //2.创建对象
                Object obj = clazz.newInstance();
                //2.获取公共有参方法
                Method m1 = clazz.getMethod("setName", String.class);
                //使用
                m1.invoke(obj, "张三");
               
                //获取公共无参方法 有返回值
                Method m2 = clazz.getMethod("getName");
                Object name = m2.invoke(obj);
                System.out.println(name);
               
                //获取私有方法
                Method m3 = clazz.getDeclaredMethod("method01");
                m3.setAccessible(true);
                m3.invoke(obj);
               
                //获取静态
                Method m4 = clazz.getMethod("method02");
                //两种都行,推荐第二种
                m4.invoke(obj);
                m4.invoke(null);
六、javaBean类和BeanUtils
        a:javaBean规范:
                类使用公共进行修饰
                提供私有修饰的成员变量
                为成员变量提供公共getter和setter方法
                提供公共无参的构造
                (实现序列号接口)
        b:BeanUtils的常用方法
                static void    setProperty(Object bean, String name, Object value)  设置任意成员属性
                static String getProperty(Object bean, String name)                                 获取任意成员属性
                static void    populate(Object bean, Map properties)                                 修改任意对象中的属性, 为传入Map集合中的键和值

4 个回复

倒序浏览
哈哈,继续努力
回复 使用道具 举报
花花送你
回复 使用道具 举报
温故而知新   加油哦   继续努力
回复 使用道具 举报

总结很不错哟~继续加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马