java中一个强大的功能,莫过于反射了。通常我们看看的Struct2、Struct1、Spring、Hibernate等等集合无一不使用了反射机制。那么什么是反射呢,到底有什么用呢?
一、反射机制概念
简单的讲,反射就是通过把指定的类中各种元素成分都映射成相关的反射包中的相应类,使得我们可以动态的调用类的相应成员,比如构造方法、成员方法、成员变量等。它被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。
换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。
二、反射的功能:
2.1在运行时判断任意一个对象所属的类 如 aclass.getClass() == bclass.getClass()
2.2在运行时构造任意一个类的对象 如Class.forName(className).netInstance(),className是运行时才得出来的类名
2.3在运行时判段任意一个类所具有的成员变量和方法
2.4在运行时调用任一个对象的方法
2.5在运行时创建新类对象
三、反射API中重点的几个类
Class:Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该Class 对象
没有构造方法,具体如何获取Class对象的实例,下面的示例代码中将会总结。
常用的方法用:
T cast(Object obj) 、static Class< > forName(String className) 、 ClassLoader getClassLoader() 、 Constructor
Constructor< >[] getConstructors() 、 Constructor
Field getDeclaredField(String name)、 Field[] getDeclaredFields() 、Method getDeclaredMethod(String name, Class< >... parameterTypes)
Method[] getDeclaredMethods() 、Field getField(String name) 、 Field[] getFields() 、 Method getMethod(String name, Class< >... parameterTypes)
Method[] getMethods() 、int getModifiers() 、String getName() 、InputStream getResourceAsStream(String name)、 boolean isArray() 、T newInstance()
Constructor:Constructor 提供关于类的单个构造方法的信息以及对它的访问权限
没用构造方法,一般都是通过Class对象中的相应类来获得Constructor对象的。
常用的方法:
Class
int getModifiers() 、String getName() 、Class< >[] getParameterTypes() 、boolean isVarArgs() 、 T newInstance(Object... initargs)
没有构造方法,也是通常Class对象中相应的方法来获取Method对象。
常用的方法:
Class< > getDeclaringClass() 、int getModifiers() 、String getName() 、Class< >[] getParameterTypes()
Class< > getReturnType() 、Object invoke(Object obj, Object... args)
Field:Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
没有构造方法,也是通常Class对象中相应的方法来获取Method对象。
常用的方法:
Object get(Object obj) 、 int getModifiers() 、String getName() 、Class< > getType() 、 void set(Object obj, Object value)。另外还支持相应的int getInt(Object obj)
与void setInt(Object obj, int value)等相应的直接对基本数据类型进行操作。
Modifier:Modifier 类提供了static 方法和常量,对类和成员访问修饰符进行解码。
这是没有构造方法的,都是通过相应的Class、Constructor、Method、Field类对象得到的,且常用的方法static boolean isPublic(int mod) 、static boolean isPrivate(int mod) 等,用个方法是static String toString(int mod)蛮好用的,此方法是返回描述指定修饰符中的访问修饰符标志的字符串。
四、反射举例代码:
在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象
[java]
package com.enhance;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Re