黑马程序员技术交流社区
标题:
学习反射的总结 和大家分享一下 交流交流
[打印本页]
作者:
乖睡觉咯
时间:
2013-8-24 15:54
标题:
学习反射的总结 和大家分享一下 交流交流
反射的总结
一。反射的概念透析
1.首先,反射不是新特性,反射是java1.2就开始有的,开发框架是必须用反射的,反射的基石是Class类,Class类跟关键字class是有区别的,类前面C是大写的,一个是关键字。一个是类,java程序中的各个java类的描述,就是Class!
2.Class类
Class类是描述所有java类的类,Class的实例对象就是内存中的一份字节码,得到该类的对象的方法有三种,一种是类名的Class,对象名。getClass(),第三种是Class。ForName("类名字符串");所谓的字节码,就是每个java类被编程后产生的.class文件,这个文件是二进制代码,被加载进内存里面,就是所谓的类的字节码,
3.Class。ForName()加载字节码有两种情况,第一种是,内存里面已经有那一份字节码,那么就直接返回那份字节码,如果没有,那么就自己加载一份进来,再返回那份字节码!
4.八个基本数据类型跟void也有相应的Class字节码,就是九个预定义的字节码
基本数据包装类。TYPE。就是得到对应的基本数据类的Class字节码!
二。理解反射的概念
1、反射就是把java类中的各种成分映射成相应的java类
2.Method是描述java类中的方法的类,
Method的实例对象就是每个java类中的一个方法,得到Method的字节码方式有,String.class.getMethod("方法名"参数列表的字节码),这样就可以得到具体的方法,入
String.class.getMethods(),可以得到类的所有的方法,返回一个method数组!
Method。invoke(对象名,值),就可以调用拿到的方法,如果对象名为null,则说明该方法是静态的
3.Field是描述java类中的成员字段的类
Field的实例对象就是每个java类中的一个成员变量,那么得到Field具体实例对象的代码如下
Field field =String.class.getField("成员变量名"),通过成员变量名呢,就可以得到具体哪一个成员变量了,Field [] field =String.class.getFields(),这个方法则可以得到类身上的所有成员变量
,需要注意的是呢,加入成员变量的私有的,那么上面的办法就没有办法拿到,Field getDeclaredField(String name) 就可以强行获取私有变量类,再public void setAccessible(boolean flag)这样声明下,就可以强行获得具体哪个对象的值了!
Field、。get(对象名),可以得到具体在哪个对象上,这个变量的值!
4.Package是描述了java类中的包名的类
Package的实例对象就是每个java类中的一个包名
5.ConstrucTor是描述了java类中的构造方法的类
Constructor的实例对象就是每个java类中的一个构造方法!
要得到一个构造方法的实现,先要得到那个方法所在类的字节码,具体可以如下
String .class.getConstructors(),这个方法就会返回String类所有的构造方法,要用一个构造方法类的数组去装!要拿到具体哪一个构造方法的话,就用参数类型去区分String .class.getConstructor(StringBuffer。class),传进去相应类型的字节码就可以,这样就可以拿到参数类型为StringBuffer,的构造方法!
构造方法可以得到自己所属的类,可以创建对应类的实例对象,可以得到它的访问修饰符!
class。newInstance(),跟构造方法。newInstance()的区别,在于,前者是调用默认的,也就是无参数的构造方法,后者可以任意指定构造方法!
6.反射比较消耗性能
7.数组的反射
1.反射调用方法,如果参数是一个数组,由于1.5jvm的新特性可变参数,jvm会去自动拆包,把你数组里面的每一个元素都当成一个参数传递进去,解决办法是,在数组外面,再多套一层数据,或者把数组强转成Object的
2. 数组的父类是Object,相同维度,相同类型的数组,是同一份字节码!
3.数组的名字,int类型数组是中括号【I,其他请见APi
4.Arrys。asList(数组),可以把数组转换成list,这样可以直接把数组的内容打印出来
作者:
外面的世界
时间:
2013-8-24 16:00
沙发,慢慢理解
作者:
breaveheart
时间:
2013-8-24 17:35
最近也在看反射。虽然有错别字但是总结的还是很好的,哈哈。
对我的理解很有帮助,直接复制过去做笔记研究了,谢谢楼主啦。
作者:
645420297
时间:
2013-8-24 23:06
不错 不错 继续努力
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2