黑马程序员技术交流社区

标题: 反射小结 [打印本页]

作者: yangxiaosa    时间: 2017-3-22 20:43
标题: 反射小结
反射:
                简述:
                        剖析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})形式。
                主要作用:
                        多用于框架和组件,写出复用性高的通用程序

作者: Mr_Maty    时间: 2017-3-22 21:28
楼主威武,很详细,不过我还是有个疑问:前期基础课讲到封装的时候封装被吹成三大特性之一,大谈封装的好处,那么问题来了,现在的反射是在赤裸裸的嘲讽封装吗

作者: yangxiaosa    时间: 2017-3-22 22:00
Mr_Maty 发表于 2017-3-22 21:28
楼主威武,很详细,不过我还是有个疑问:前期基础课讲到封装的时候封装被吹成三大特性之一,大谈封装的好处 ...

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

感谢,我学的更少,还没升就业班,只是个小疑惑

作者: 泪桥    时间: 2017-3-23 00:22
又长知识了
作者: mrwalker    时间: 2017-3-23 09:16
楼主每天都总结么?你们基础班上多久
作者: yangxiaosa    时间: 2017-3-23 14:16
mrwalker 发表于 2017-3-23 09:16
楼主每天都总结么?你们基础班上多久

基础班上完了
作者: linzpcom    时间: 2017-3-24 18:39
谢谢楼主分享,学习了




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