天天看点

java中的反射(基本知识点)

一个类或者对象通过反射可以获得自身的对象,该对象是一个java.lang.Class 的对象(就像一个镜像文件)。

 一个对象或者类获得自身的Class对象的过程称为反射。有三种方法可以获得自身的Class对象引用(对每一个被装载的类型(类或接口),虚拟机都会为它创建一个java.lang.Class的实例):

      1) Class c = Class.forName(“com.briup.ch06.Student”); //虚拟机中没有该类的Class的实例对象

      2) Class c = stu.getClass()        //虚拟机已经存在Class的实例对象

          Class c = this.getClass(); //虚拟机已经存在Class的实例对象

      3) Class c = Student.class;       //通过类名.class

      注意:类和它所创建的所有对象通过反射获得的Class对象都是同一个,在这个例子中是com.briup.ch06.Student

  反射可以让我们利用这个Class对象来获取和修改私有的变量和方法,不通过共有的方法去获得,可以破坏数据的封装性。

            反射:

            1) 确定一个对象的class,镜像也是一个对象,属于java.lang.Class

            2) 可以获得一个类的修饰符、字段、方法、构造器和父类。

            3) 获得接口声明的常量和方法。

            4) 创建Class的实例,直到运行时才获得。

            5) 运行前即使字段名字不知道,可以到程序运行时获得和修改这些字段的值。

            6) 运行前即使对象的方法名不知道,可以到程序运行时触发调用该方法。

            7) 运行前创建了一个大小和元素都未知的新数组,可以到运行时修改数组的元素。

 反射的重要方法调用

Class.forName(String className)

  通过全类目获取镜像对象

newInstance() 

 调用类中的无参构造器,创建实例

getField(String name)

 获取类中当前可见的属性

getDeclaredField(String name)

 获取类中声明的所有的属性

getMethod(String name,Class... para)

 获取类中当前可见的方法

getDeclaredMethod(String name,Class... para)

 获取类中声明的所有的方法

getConstructor(Class... para)

 获取类中声明的可见构造方法

getDeclaredConstructor(Class... para)

 获取类中声明的任何构造方法

    java.lang.reflect.Field

  get(Object obj)

  set(Object obj,Object value)

    java.lang.reflect.Method

  invoke(Object obj,Object... value)

    java.lang.reflect.Constructor

  newInstance(Object... value)

反射优缺点:      

      反射机制通过在运行时探查字段和方法,从而可以帮助写出通用性很好的程序,这项能力对系统编程来说特别有用,但它并不适合于应用编程。而且,反射是脆弱的——编译不能帮助你发现编译错误,任何错误在运行时被发现并且都会导致异常。