浅谈 java 反射机制

一:Java反射概念

Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。

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

二:什么时候用到反射机制

你只有一个类的定义,但是不能显式地创建一个类的时候,就需要使用反射机制来操作
一个最简单的例子就是jdbc编程中加载类驱动就是通过反射机制来实现的:Class.forName("com.MySQL.jdbc.Driver.class").newInstance();

现在很多开 框架都用到反射机制,hibernate、struts都是用反射机制实现的。

三:反射机制能够获取哪些信息

     一句话,类中有什么信息,它就可以获得什么信息,不过前提是得知道类的名字,要不就没有后文了
    首先得根据传入的类的全名来创建Class对象。
    Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo;
    Object obj=c.newInstance();//创建对象的实例 
    OK,有了对象就什么都好办了,想要什么信息就有什么信息了。   

    1.  获取类的方法
    1.1)Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法

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

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

    1.4)Method[] getDeclaredMethods()//获得所以的public和非public方法
    2. 获取类的构造函数
    2.1)Constructor getConstructor(Class[] params)//根据指定参数获得public构造器

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

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

    2.4) Constructor[] getDeclaredConstructors()//获得public的所有构造器
    3. 获取类的属性
    3.1)Field getField(String name)//根据变量名得到相应的public变量

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

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

    3.4)Field[] getDeclaredFields()//获得类中所有的public和非public方法
   4.获取类的Class对象

   4.1)调用getClass---------Boolean var1 = true;Class<?> classType2 = var1.getClass();

   4.2)运用.class 语法-----Class<?> classType4 = Boolean.class;System.out.println(classType4);

   4.3)运用static method Class.forName()---Class<?> classType5 = Class.forName("java.lang.Boolean");System.out.println(classType5); 

   4.4)运用primitive wrapper classes的TYPE 语法-------Class<?> classType3 = Boolean.TYPE;System.out.println(classType3);  


四:反射机制的优点与缺点

    为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
    静态编译:在编译时确定类型,绑定对象,即通过。
    动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。
    一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能 的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。
       它的缺点,第一个是性能问题。当用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。许多应用更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射-- 仅在它可以真正增加灵活性的地方 -- 记录其在目标类中的使用。

参考资料:

http://champion-netjava-163-com.iteye.com/blog/982080

http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.htm

http://zlb1986.iteye.com/blog/937781

http://jspengxue.iteye.com/blog/39945

原文地址:https://www.cnblogs.com/huhongy/p/7379871.html