二十六、JavaSE----反射

52 阅读3分钟

反射:

      反射是Java中一个非常重要同时也是一个高级特性,基本上Spring等一系列框架都是基于反射的思想写成的。Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法;对于任意 一个对象,都能够知道调用它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为 java语言的反射机制。

Java反射机制主要提供了以下这几个功能:

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所有的成员变量和方法
  • 在运行时调用任意一个对象的方法

        反射就像是一个掌控全局的角色,不管程序怎么运行,使用者都能够知道你这个类有哪些属性和方法,这个对象是由谁调用的,反射的优点显而易见。

下面是一个典型的反射类

 与Java反射有关的类主要有

Class类

        在Java中,每定义一个java class实体都会产生一个Class对象。也就是说,当我们编写一个类, 编译完成后,在生成的 .class文件中,就会产生一个Class对象,这个Class对象用于表示这个类的类型信息。Class中没有公共的构造器,也就是说Class对象不能被实例化。

其中Class类包括的方法有:

toString()

         toString()方法能够将对象转换为字符串,toString()首先会判断Class类型是否是接口类型,也就是说,普通类和接口都能够用Class对象来表示,然后再判断是否是基本数据类型,这里判断的都是基本数据类型和包装类,还有void类型。

类型有如下几种:

  • java.lang.Boolean :代表boolean数据类型的包装类
  • java.lang.Character:代表char数据类型的包装类
  • java.lang.Byte:代表byte数据类型的包装类
  • java.Iang.Short:代表short数据类型的包装类
  • java.lang.Integer:代表int数据类型的包装类
  • java.lang.Long:代表long数据类型的包装类
  • java.lang.Float:代表float数据类型的包装类
  • java.lang.Double:代表double数据类型的包装类
  • java.lang.Void:代表void数据类型的包装类

getName()

        这个方法返回类的全限定名称。

  • 如果是引用类型,比如 String.class.getNameQ -> java. lang. String
  • 如果是基本数据类型,byte.class.getNameO -> byte
  • 如果是数组类型,new Object[3]).getClass().getName() -> [L java. lang.Object]

forName()

        根据类名获得一个Class对象的引用,这个方法会使类对象进行初始化。

例如 Class t = Class. forName(" java. lang.Thread") 就能够初始化一个 Thread 线程对象

getClassLoader()

        获取类加载器对象。

getDeclaredMethods()

        获得该类所有方法

Field类

        Field类提供类或接口中单独字段的信息,以及对单独字段的动态访问。

equals(Object obj)

        属性与ob j相等则返回true

get(Object obj)

        获得obj中对应的属性值

set(Object obj, Object value)

        设置obj中对应属性值

Method

invoke(Object obj, Object... args)

        传递object对象及参数调用该对象对应的方法

ClassLoader

        反射中,还有一个非常重要的类就是ClassLoader类,类装载器是用来把类(class)装载进JVM 的。ClassLoader使用的是双亲委托模型来搜索加载类的,这个模型也就是双亲委派模型。

ClassLoader的类继承图如下: