经验22-JDK新特性6-反射1-反射入门及Class类

心得22--JDK新特性6-反射1-反射入门及Class类

1.反射简介

反射可以理解为在运行时获取对象类型信息的操作。反射(Reflection)的概念是由Smith1982年首次提出来的,主要是程序可以访问、检测和修改其自身状态或行为的一种能力。

反射是java语言的特征之一,它允许动态地发现和绑定类、方法、字段,以及所有其他的由语言所产生的元素。反射做的不仅仅是简单的列举类、字段以及方法,通过反射在运行时还能完成创建实例、调用方法以及访问字段的工作。反射是java被誉为动态(准动态)的关键。一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分

Java反射所需要的类并不多,主要有java.lang.Class类和java.lang.reflect包中的Field、Constructor、Method、Array类。(Array只作了解)

Class类:Class类的实例表示正在运行的java应用程序中的类和接口。

Filed:提供有关类和接口的属性信息,以及对它的动态访问权限。可以将其简单的理解为一个封装反射类的属性的类。

Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。

Method类:提供关于类的单个方法的信息以及对它的访问权限。

Array类:提供动态创建数组和访问数组的静态方法。该类中所有方法都是静态方法。

注意:Class类是Java反射的起源,针对任何一个你想探勘的类,只有先为它产生一个Class类的对象,接下来才能通过Class对象获取其他想要的信息。

2.  Class

Java程序运行时,系统会对所有的对象进行所谓的运行时类型标识,用来保存这些类型信息的类就是Class类。JVM为每种类型管理着一个独一无二的Class对象----每个类(型)都有一个Class对象。

Java程序运行过程中,当需要创建某个类的实例时,JVM首先检查所要加载的类对应的Class对象是否已经存在。如果还不存在,JVM就会根据类名查找对应的字节码文件并加载,接着创建对应的Class对象,最后才创建出这个类的实例。Class类对象用来保存这些类型信息的。

例如:

•       Java基本数据类型(boolean、byte、char、short、int、long、float 和 double);

•       关键字void 也都对应一个 Class 对象;

•       每个数组属性也被映射为 Class 对象,所有具有相同类型和维数的数组都共享该 Class 对象。

Class类即然代表某个类的字节码,它当然就要提供加载某个类字节码的方法:forName()。forName方法用于加载某个类的字节码到内存中,并使用class对象进行封装

1).获取Class类对象的三种方法:

packagecom.java.reflect;

publicclass Demo1 {

 

   /**

    * @param args

    * @throws ClassNotFoundException

    */

   publicstaticvoid main(String[] args) throws ClassNotFoundException {

 

      //获得类的三种方式

      //1.使用Class类的forName()静态方法获得与字符串对应的Class对象

      Classc1 = Class.forName("com.java.reflect.Person"); //这里的包路径可以直接右击包资源管理器下的包然后选择复制限定名,记住是右击包而不是某个类,右击类会出现/java高级/src/com/java/reflect/Person.java

      System.out.println(c1);   //ForName方法返回与带有指定字符串名的类或接口相关联的class对象

     

      //2.使用类名.class”获取该类型对象的Class对象

      Classc2 = Person.class;  //如果是int型的,则表示为:int.class

      System.out.println(c2);

     

      //3.调用Object类的getClass()方法来得到Class对象,这是最常见的方法。

      Personp = new Person();

      Classc3 = p.getClass();

      System.out.println(c3);

   }

2)       Class对象提供了如下常用方法:

Public String getName():获取此Class对象所表示实体的完全限定名(即src包路径)

Public Field[]  getFields(): ….实体的所有public字段

public Field[] getDeclaredFields(): ….实体的所有字段

Public Method[]  getMethods():….实体的所有public方法

public Method[] getDeclaredMethods():….实体的所有方法

Public Constructor  getMethod(Class<?>...parameterTypes):

获取此Class对象特定的方法。

Public Constructor  getConstructor(Class<?>... parameterTypes) :构造方法

public Constructor getDeclaredConstructor(Class...parameterTypes)

public class getSuperClass():获取实体父类的class

public class[] getInterfaces():获取实体实现的所有接口

public class[] getAnnotations():获取此元素上所有的注释

这些方法分别用于从类中解剖出构造函数、方法和成员变量(属性)。解剖出的成员分别使用Constructor、 Method 、 Field 对象表示。