Java Reflect

系统 1561 0
    面对Java反射机制,会有种令人敬畏而又好奇的感觉,觉得非常强大,深不可测!呵,其实是懒惰的表现,总是找借口和理由不去深入学习这些东西,觉得实际开发中很少会用到,能混就混混吧。真该死。
    下面就来浅谈下反射,也总结下这几天学习的心得,仅供个人总结,不足之处请大家看在小弟能力有限学习未深的份上多多包涵呵。 
    每个class都其实都对应一个Class对象,该对象就包含在我们编写完一个类编译之后在相应的路径下产生一个.class文件中,该Class对象就用于表示这个类的类型信息。在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。
    OK,初步了解了以上类的被加载机制后,我们就开谈Java Reflect的乐趣吧。
    Java不是动态语言,但是通过java reflect我们可以实现类似动态语言的特性,靠的是什么?就是java reflect API,而java reflect 靠的是什么?其根本就是从每个类所对应的Class对象中所定义的各种方法。也就是说,要想对某个类使用反射机制动态对其进行某些特殊操作,我们必须先获取该类所对象的Class对象,它就是反射的一个入口,怎么样来获取Class对象呢?有以下几种常用的方法:
    1、利用对象调用getClass()方法获取该对象的Class实例。打开JDK文档,该方法定义在Object类中,也就是说,java中所有的类都拥有该方法,因为java中任何对象都是延伸自Object父类的。该方法返回Class对象,如果类型不确定,可以使用泛型Class<?>
     2、使用Class类的静态方法forName(),用类的全路径名字获取一个Class实例。这个方法就不用多说了呵,初学Java JDBC时我们就用过,典型的反射应用。
     3、运用.class的方式来获取Class实例,如(类名.class),对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例。int.class ,Integre.class ,Integer.TYPE)
    好了,现在我们得到了一个类的Class对象了,那么该怎么下手哩?仔细想想,我们在定义一个类的时候,无非只有四种存在,
    1、Field : 属性
    2、Constructor : 构造子
    3、Method : 方法
    4、Array : 可能会定义的数组
    以上几种就是我们在类定义的时候类中存在最基本的元素,但反射是在运行时对类对象进行操作的,所以我们也有可能需要对某个属性或方法的访问权限进行获取,以对该对象更全面的了解,所以Modifier的获取也是必然的。
    请打开JDK文档的java.lang.reflect包,该包下就会找到上述几个东东,原来在该反射包中,它们都被定义成类了,并且在每个类中都定义了对其操作的各种方法。有人可能要问了,这几个类跟Class对象有什么关系?呵,关系大了去了,比如Constructor是构造方法类,它一般用于构造某个带参构造器类的对象的时候使用,比如某个类只提供了一个带参构造器,这时就需要使用该类的Class对象的getConstructor()方法返回Constructor对象,再用该对象的newInstance()方法来构造该类。也就是说,以上几个类,都是基于Class对象来对某个类进行操作的。
    总之,Class代表的是类对象,上述几个类可以看成是工具,我想怎么去对一个类对象在运行时进行操作,就是依靠该类的Class对象来告诉上述几个类:“我想让你(Field、Constructor、Method、Array、Modifier等)告诉我此时我代表的这个对象的某些信息,因为我要在这个运行时刻对它进行一些操作!”
    所以,在java反射中,只要把这几个类的关系及其作用弄清楚之后,对java反射也就有了一个大致的了解了,对于一些架构或是开源框架的一些“智能”也就不会感到那么高深莫测了呵。其实java reflect技术是java中的核心机制,十分重要。小弟不才,说了半天没表达清楚什么,继续努力!
    

Java Reflect


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论