黑马程序员技术交流社区

标题: 黑马程序员_JAVA学习总结_反射机制 [打印本页]

作者: 杨玲    时间: 2013-2-7 22:35
标题: 黑马程序员_JAVA学习总结_反射机制
------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------

现在总结反射机制,个人感觉反射在JAVA中是相当重要的.我让为的反射:在java中执行一个
程序之前会先把其编译成class文件,而反射就是在运行时把已有的class文件进行反编
译的并在这个过程中,把类中的所有元素转换成JAVA中的类的一个过程,因为一个Class
文件就相当于一个类,那么反射就是以类为单位进行操作的了.对于反射的内容包括以下
几点:

1.类的字节码(Class)
2.反射时的构造方法.
3.反射时的普通方法.
4.反射时的成员变量.

1.类的字节码(Class)
        要想实现反射,在JAVA中就必须借助与Class类,它是反射的基础.每一个类在编译时
        都会被编译成.class 文件.而在运行时,JVM会把这些要用到的文件加载到内存中,
        这时这些文件就是以一段段的字节码的形式表示的,而这些字节码也被java封装成了
        一个对象,这个对象就是Class,而java中        实现反射就是以一个Class为单位操作的,
        所以要实现反射就必须先有这么一个对象了.要想得到Class类的实例有三种方式:
        1.类名.class;如:
          Class clazz = String.class;
        2.调用Class类的静态方式forName方法,它有几个重载形式,这里用传入路径的,如:
          Class clazz = Class.forName("java.lang.String");
        3.调用已有对象的getClass方法.如:
          String str = "abc";
          Class clazz = str.getClass();
另外说明一下:
        Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注
        释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类
        型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、
        short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

有了字节码对象,就可以通过这个对象的方法对其进行操作,可以得到它的构造方法,普通
方法,成员变量等等.先说构造方法.

2.反射时的构造方法.
        现在先用这个对象得到构造方法.有以下几种方法可以获得构造方法:

        获得所有的构造方法或一个构造方法(不包括私有的)
        Constructor<?>[] getConstructors()                
        Constructor<T> getConstructor(Class<?>... parameterTypes)
       
        获得所有的构造方法或一个构造方法(包括私有的)
        Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)           
        Constructor<?>[] getDeclaredConstructors()

        Constructor是一个用来表示构造方法的类,我们就可以用这一个Constructor对象来操
        作这个构造方法了.通过这个对象,可以知道这个构造方法的更具体的信息.甚至可以用
        它创建一个新的实例对象.

3.反射时的普通方法.
        要获得普通方法和构造方法基本类似.可以调用以下几个方法:
        获得类中的所有方法或者一个方法.(包括私有的)
        Method getDeclaredMethod(String name, Class<?>... parameterTypes)
        Method[] getDeclaredMethods()
        获得类中的所有方法或者一个方法.(不包括私有的)
        Method getMethod(String name, Class<?>... parameterTypes)        
        Method[] getMethods()

        Method是一个用来表示普通方法的类,我们可以从它的方法中获得一个普通方法的更具体
        的信息.也可以直接调用,但是在调用时必须先得到它的参数类型和个数,并在调用时传入.

4.反射时的成员变量.
        获得某个或所有的成员变量(包括私有的)
        Field getDeclaredField(String name)
        Field[] getDeclaredFields()

        获得某个或所有的成员变量(不包括私有的)
        Field getField(String name)
        Field[] getFields()

        Field是一个用来表示成员变量的类,可以通过它获得这个成员更具体的信息.在需要的时候
        还可以通过它对这个类的一个实例的成员的值进行修改.

由此可见,我们可以通过反射把一个JAVA类文件中的基本元素都还原出来,这就相当于是一个逆向
工程呀.我喜欢.呵呵
对于反射的总结也先到此为止.关于它的应用我再写一个把类的所有元素列出来的小程序就OK了.






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2