前言
今天设想了一种开发模式。。。
个人博客系统还在开发。。。
今天准备对反射技术做一个总结。。。
本文以对象序列化的过程对反射的应用举一个简单例子
什么是反射
Java的反射(reflection)是一种机制,是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。
反射的功能
Ⅰ、在运行时判断任意一个对象所属的类
Ⅱ、在运行时构造任意一个类的对象
Ⅲ、在运行时判断任意一个类所具有的成员变量和方法
Ⅳ、在运行时调用任意一个对象的方法
Ⅴ、生成动态代理。
反射相关类
java反射的需要用到的类大多位于java.lang.reflect包里面,该包提供了获取类和对象信息的接口和类。
Class类
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
以下示例使用 Class 对象来显示对象的类名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
还可以使用一个类字面值(JLS Section 15.8.2)来获取指定类型(或 void)的 Class 对象。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());
get系列方法
方法名 | 返回值 | 方法说明 |
---|---|---|
getDeclaredClasses() | Class<?>[] | 返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口。 |
getDeclaredConstructor(Class<?>… parameterTypes) | Constructor<T> | 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。 |
getDeclaredConstructors() | Constructor<?>[] | 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。 |
getDeclaredField(String name) | Field | 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 |
getDeclaredFields() | Field[] | 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。 |
getDeclaredMethod(String name, Class<?>… parameterTypes) | Method | 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 |
getDeclaredMethods() | Method[] | 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 |
is系列方法
方法名 | 返回值 | 方法说明 |
---|---|---|
isArray() | boolean | 判定此 Class 对象是否表示一个数组类。 |
isEnum() | boolean | 当且仅当该类声明为源代码中的枚举时返回 true。 |
isInstance(Object obj) | boolean | 判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。 |
isInterface() | boolean | 判定指定的 Class 对象是否表示一个接口类型 |
isPrimitive() | boolean | 判定指定的 Class 对象是否表示一个基本类型。 |
Field类
Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
Array 允许在执行 get 或 set 访问操作期间进行扩展转换,但如果将发生收缩转换,则抛出一个 IllegalArgumentException
Filed类主要是获取某个对象在该成员上的信息,并提供了获取基础数据类型的方法,这里不一一列举。
Method类
Method类主要是invoke方法的使用。
程序介绍
本程序采用反射方式实现对象的序列化,在web开发的过程中,经常需要操作基础表,而基础表的数据往往对应一个实体类的对象,如果把这个对象进行序列化,使其toString方法,返回一个插入基础表一条数据的sql语句,那么这个功能就可以被复用,形成一个组件。