Reflection
-
反射是J2SE1.1就已经提出了,但当时仅支持Introspection自省。在1.2之后开始逐渐成熟,spirng、hibernate等成熟框架都大量使用java反射技术实现。
在面向对象设计思想中,使用类这一概念表述一类具有相同属性的对象;而这些属性值具体是什么,由该类的每个实例化对象来确定,每个对象可以有不同的属性值。反之,这些是否属于同一类事务,java使用Class来描述类的访问属性、包名、字段名。学习反射,首先就要了解这个首字母大写的-Class
一、Class—字节码
在源程序中,实例化某个类时,先将类编译成.class形成二进制代码,然后把二进制代码加载到java内存中,用于创建对象。这个二进制代码就是Class类的字节码(Byte-code)。当使用到多个类时,内存中就会加载多个不同的字节码,占用内存空间。字节码跟类是对应的,不同字节码在jvm中的内容以类的类型区分。
有了对象实例,通过obj.getClass()方法也可以获得这个对象在内存中的字节码,得到字节码方可得到这个对象所对应的类。反之,知道了这个类也可以获得实例对象。
二、一个New并不能解决问题
那么问题来了,有些人可能会说,干嘛那么麻烦都个大圈,我直接new 一个类,不就可以轻松创建这个实例吗?
这就涉及到java对象创建的两个编译方式:静态编译和动态编译
静态编译:在编译时确定对象,绑定对象即可通过编译。