反射机制:
指的是可以于运行时加载,探知,使用编译期间完全未知的类。程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个;已加载的类,都能知道这个类的所有方法
属性;对于任意一个对象,都能够调用它的任意一个方法和属性,加载完类之后,在堆内存中,就产生了一个Class类型的对象,(一个类只有一个Class对象 )这个对象就包含了完整
的类的结构信息,我们可以通过这个对象看到类的结构,这个对象就像一面镜子,形象的称为:反射
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注解是一种接口。 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的
组都共享该 Class 对 象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也 表示为 Class 对象。
Class 类是整个 Java 反射机制的源头,Class 类本身表示 Java 对象的类型,获取 Class 对象的方法有很多种,比如我们可通过 Class clazz = 类.class 方式获得某个类的 Class实例
方式 | 说明 |
1.通过类名获得类实例 Class 类实例 = 类名.class | 1. 这种方法获得类对象比较直接 2. 对于基本类型来说,他们也有自己的类对象, 并且要获 得基本类型的类对象,只能通过类型名.class来获得类对象。 例如 Class intClass = int.class; |
2. 通过 Class 的 forName 方法加载类获得类实例 Class 类实例 = Class.forName("类名"); | 1. Class.forName("类名");注意这种方式,类名必须是带有 完整的包名。 例如 Class.forName("com.mysql.jdbc.Driver"); 2. 这种加载类的方式在编译阶段就会进行实例化,类 名.class 方式是执行阶段类加载给虚拟机时才进行实例化 |
3.通过类的实例化对象获得类实例 Class类实例 = 具体对象.getClass() | getClass()方法源自于 Object 类,所有的类的实例化对象均 可通过 getClass()方法获得所属类的类实例对象 |
以上是获得 Class 类实例的方法,在实际应用中,根据实际应用场合选择方法,所知信息为类名, 就使用类名.class 方式,所知信息为对象,就使用对象.getClass()方式。
在得到 Class 类实例后,根据 Class 类实例就可以得到所属类的各种信息了,首先是类的整体信息
API
方式 | 说明 |
String getName() | 获取类的名称,包括包名 |
String getSimpleName() | 获得类的简称,不包括包括包名 |
Class<? super T> getSuperClass() | 获得本类的父类的类信息(Class ) |
Class<?>[] getInterfaces() | 获得本类实现的所有接口的类信息 |
获取类的成员属性 API
方式 | 说明 |
Field getField(String name) | 根据变量名,返回一个具体的具有 public 属性的成 员属性 |
Field[] getFields() | 返回具有 public 属性的成员属性数组 |
Field DeclaredField(String name) | 根据变量名返回一个成员变量(不分 public 和非 public 属性) |
Field[] DeclaredFields() | 返回所有成员变量组成的数组(不分 public 和非 public 属性) |
获取类的成员方法 API
方式 | 说明 |
Method getMethod(String name, Class<?>... parameterTypes) | 根据方法名和参数类型,返回一个具体的 具有 public 属性的方法 |
Method[] getMethods() | 返回所有具有 public 属性的方法数组,包 括从父类继承的public方法和实现接口的 public 方法 |
Method getDeclaredMethod(String name, Class<?>... parameterTypes) | 根据方法名和参数类型,返回一个具体的 方法(不分 public 和非 public 属性) |
Method[] getDeclaredMethods() | 返回该类中的所有声明的方法数组(不分 public 和非 public 属性) |
获取类的构造方法 API
方法名 | 说明 |
Contructor getConstructor(Class<?>... parameterTypes) | 根据构造方法的参数类型,返回一个具 体的具有 public 属性的构造方法 |
Contructor getConstructor() | 返回所有具有 public 属性的构造方法数 组 |
Constructor getDeclaredConstructors(Class<?>... parameterTypes) | 根据构造方法的参数类型,返回一个具 体的构造方法(不分 public 和非 public 属性) |
Constructor getDeclaredConstructors() | 返回该类中所有的构造方法数组(不分 public 和非 public 属性) |