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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangxiaosa 中级黑马   /  2017-3-22 20:43  /  849 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射:
                简述:
                        剖析Java类中的各个组成部分映射成一个个java对象:
                        涉及到的类:
                                java.lang.Class类:用于表示一个类的字节码(.class)文件
                                        得到某个(.class)文件对应的Class对象:
                                                类名确定时:类名.class
                                                对象确定时:对象.getClass()
                                                类名和对象不确定时:Class.forName("类全名"),类全名指:包名.类名
                                        成员方法:
                                                Class Class.forName("类全名");通过类名,加载类字节码到内存中,并封装成一个Class对象
                                                Object newInstance();用来调用类的构造方法,创建一个该类对应的对象
                                                        例:String obj = (String)Class.forName("java.lang.String").newInstance();
                                                获取普通成员:
                                                Constructor getConstructor(Class clazz,...);获取指定参数列表的构造函数对象
                                                        如:获取String(String str);这个构造:
                                                                Class.forName("java.lang.String").getConstructor(String.class);
                                                Method getMethod(String methoName,Class clazz,...);获取指定方法名和指定参数列表的成员方法对象
                                                Field getField(String name);获取指定名称的字段对象
                                                获取私有成员:
                                                Constructor getDeclaredConstructor(Class clazz);
                                                Method getDeclaredMethod(String name,Class clazz,...);
                                                Field getDeclaredField(String name);
                                                        --设置私有成员可以被访问:
                                                                setAccessible(boolean b);
                                reflect类:
                                        Constructor类:字节码对象的构造方法对象
                                                获取某个字节码对象的所有构造方法:
                                                        Constructor[] constructor = 字节码对象.getConstructors();
                                                        Constructor[] constructor = 字节码对象.getDeclaredConstructors();
                                                获取指定的构造方法:
                                                        Constructor constructor = 字节码对象.getConstructor(参数类型.class,...);
                                                成员方法:
                                                        newIncetence(...);构造一个对象
                                        Field类:字节码对象中的成员变量对象
                                                获取字节码对象中所有成员变量对象:
                                                        Field[] fields = 字节码对象.getFields();
                                                        Field[] fields = 字节码对象.getDeclaredFields();
                                                获取指定的成员变量对象:
                                                        Field field = 字节码对象.getField(String fieldName);
                                                        Field field = 字节码对象.getDeclaredField(String fieldName);
                                                设置Field变量是否可以访问:
                                                        field.setAccessible(boolean b);
                                                        在一个类中调用其他类的私有方法是,需要设置,当前类则忽略
                                                Field变量值的读取和设置
                                                        field.get(obj);obj是所要获取的字段所在的对象
                                                        field.set(obj);obj是所要设置的字段所在的对象
                                        Method类:字节码中成员方法对象
                                                获取字节码对象中所有成员方法对象:
                                                        Method[] methods = 字节码对象.getMethods();
                                                        Method[] methods = 字节码对象.getDeclaredMethod();
                                                获取指定的成员方法对象:
                                                        Method method = 字节码对象.getMethod(String name,参数.class,...);
                                                        Method method = 字节码对象.getDeclaredMethod(String name,参数.class,...);
                                                例子:
                                                        获取方法:
                                                        Method charAt = Class.forName("java.lang.String").getMethod("charAt",int.class);
                                                        调用方法:
                                                                一般方式:str.charAt(1); 对象.方法名(参数,...);
                                                                反射方式:charAt.invoke(str, 1); 方法名.invoke(对象,参数,...);
                                                                        如果该方法是一个静态方法,对象参数可以写null.
                                                jdk1.4和jdk1.5的invoke方法的区别:
                                                        Jdk1.5:public Object invoke(Object obj,Object... args),
                                                        Jdk1.4:public Object invoke(Object obj,Object[] args),
                                                        即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,
                                                        数组中的每个元素分别对应被调用方法中的一个参数,
                                                        所以,调用charAt方法的代码也可以用Jdk1.4改写为 charAt.invoke(“str”, new Object[]{1})形式。
                主要作用:
                        多用于框架和组件,写出复用性高的通用程序

7 个回复

倒序浏览
楼主威武,很详细,不过我还是有个疑问:前期基础课讲到封装的时候封装被吹成三大特性之一,大谈封装的好处,那么问题来了,现在的反射是在赤裸裸的嘲讽封装吗
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
Mr_Maty 发表于 2017-3-22 21:28
楼主威武,很详细,不过我还是有个疑问:前期基础课讲到封装的时候封装被吹成三大特性之一,大谈封装的好处 ...

这个,我也学的浅,只知道:
反射能提高框架的通用性,所以框架中多会用反射,一般自己写东西用到反射的情况少。
封装能提高代码的复用性和安全性,我们平常写东西一般都会用到java已经封装好的类,有时自己也会封装一些东西,然后调用。
两个应该不冲突,只是用处不同。
回复 使用道具 举报
yangxiaosa 发表于 2017-3-22 22:00
这个,我也学的浅,只知道:
反射能提高框架的通用性,所以框架中多会用反射,一般自己写东西用到反射的 ...

感谢,我学的更少,还没升就业班,只是个小疑惑
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
又长知识了
回复 使用道具 举报
楼主每天都总结么?你们基础班上多久
回复 使用道具 举报
mrwalker 发表于 2017-3-23 09:16
楼主每天都总结么?你们基础班上多久

基础班上完了
回复 使用道具 举报
谢谢楼主分享,学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马