Java反射是java语言的一个很重要的特征,它使得java具体了“动态性”特征。




    在java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于java语言的反射(reflection)机制。



一,什么是反射机制


         简单来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。


二,哪里用得到反射机制


        在刚刚学jdbc的时候用过这样一行代码,Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道这行代码是生成驱动对象实例,并不知道它的具体含义。其实这就是反射,现在很多的开源框架都用到了反射机制,hibernate,struts都是用反射机制实现的。


三,反射机制的优点和缺点


            静态编译:在编译时确定类型,绑定对象。


            动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,以降低类之间的耦合性。



            一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很好的灵活性,特别是在J2EE的开发中,一个大型的软件,更新某些功能时,如果不采用动态编译,就需要重新安装新版本的软件,再把整个软件重新编译一次才能实现更新,而采用反射的话,就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现软件更新。


           它的缺点就是对性能有一定的影响。使用反射基本上是一种解释操作,我们可以告诉jvm,我们希望做什么,并且它满足我们的要求,这类操作总是慢于直接执行相同的操作。


四,利用反射机制能获得什么信息


         类中有什么信息,它就可以获得什么信息,不过前提是得知道类的名字。


         首先得根据传入的类的全名来创建Class对象。



       Class c=Class.forName("className");     className必须为全名,也就是得包含包名


       Object obj = c.newInstance();//创建对象的实例 



       有了对象就什么都好办了,想要什么信息就有什么信息了。


       


获得构造函数的方法


Constructor getConstructor(Class[] params)//根据指定参数获得public构造器 

 

      Constructor[] getConstructors();//获得public的所有构造器 

 
 

      Constructor getDeclaredConstructor(Class[] params);//根据指定参数获得public和非public构造器 

 

     Constructor[] getDeclaredConstructors()//获得public的所有构造器

获得类方法的方法


Method getMethod(String name, Class[] params);//根据方法名,参数类型获得方法 

 
 

      Method[] getMethods() // 获得所有的public方法 

 

      Method getDeclaredMethod(String name, Class[] params);//根据方法名和参数类型,获取public和非public的方法 

 
 
 Method getDeclaredMethods();//获得所有的public和非public方法


 获得类中属性的方法


Field getField(String name)//根据变量名得到相应的public变量 

 

      Field[] getFields()//获得类中所有public的方法 

 
 

      Field getDeclaredField(String name)//根据方法名获得public和非public变量 

 

     Field[] getDeclareField()//获得类中所有的public和非public方法


五,实例代码



       看完代码瞬间就懂了反射的用处有没有



初学java反射机制,看到这篇入门博客,收获不少,写下这篇博客算是笔记吧,哈哈