反射

来源:互联网 发布:什么软件录屏有声音 编辑:程序博客网 时间:2024/06/06 05:30

      反射就是把java类中的各种成分映射成相应的java类

      java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象都能调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能成为java语言的反射机制。

       java反射机制的主要功能:在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

       java反射的基石—Class类

       java程序中的各个类属于同一类事物,描述这类事物的java类名就是Class。Class用来描述所有类的共同特性,如:类的名字,类的访问列表,类所属于的包名,字段名称的列表,方法名称的列表等。

       Class类和一般类不同,它不能通过new来实例对象,它的实例对象就是类在内存中的字节码,所以Class类的实例过程就是类获取字节码的过程。类字节码的获取方式有三种:

                           1、类名.class                  例如:System.class, String.class

                           2、对象.getClass()                 例如:new String().getClass

                           3、Class.forName("类名")              例如:Class.forName("java.lang.String")

       有九个预定义Class实例对象:八个基本数据类型,void

       同一个类不同对像在内存中的字节码是相同的

       构造方法的反射—Constructor类

     Constructor类的实例对象代表一个构造方法。  

      得到某个类所有的构造方法:

            例如: Constructor[] constructors = Class.forName("java.lang.String").getConstructors();

      得到某一个构造方法:

            例如:Constructor cnstructor = Class.forName("java.lang.string").getConstructor();

       Constructor对象调用newInstance()创建此构造方法的声明类的新实例,并用指定的参数初始化该实例。

            例如:Constructor constructor = String.class.getConstructor(StringBuffer.class);//参数决定所获得的构造方法

                        String str = (String)constructor.newInstance(new StringBuffer("abc"));

       成员变量的反射—Field类

        Field类代表某个类中的一个成员变量,而不是某个类对象中的变量,可用其调用get(对象名)获得对象的变量值

        Class类提供了getField()方法返回一个Field对象,用于实例化Field类,不过getField()方法仅适用于可见的字段,为此Class类又提供了getDeclaredField()方法适用于所有声明过的字段。Field类提供的setAccessible(true)方法可将字段由不可见设置为可见,如下例:

        

     成员方法的反射—Method类

      Method类代表类中的一个成员方法

       得到类中的某一个方法:

             例子:  Method charAt = String.class.getMethod(“charAt”,int.class);

       调用方法:

              例子:  charAt.invoke(str, 1) //由带有指定参数的指定对象调用该Method实例对象,若上例中的str为null,则表明 该Method实例对象对应的是一个静态方法。

       

     

原创粉丝点击