Java Reflection (JAVA反射)
Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。
Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。
JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。
像Struts2.0 Hibernate Spring 都是利用了这一特性。
下面先看一个简单例子 打印一个类里面的属性和方法,代码比较简单,在这里久不解释了,运行一下看看结果就明白了。
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
- public class Test {
- public static void main(String[] args) {
- show("java.util.Date");
- }
- /**
- * 打印一个类里面定义的属性和方法
- * @param className
- */
- @SuppressWarnings("unchecked")
- private static void show(String className) {
- try {
- Class c = Class.forName(className);
- //获取定义的属性
- Field[] fields = c.getDeclaredFields();
- System.out.println(className + " 类包含的属性有:");
- for (Field f : fields) {
- int mod = f.getModifiers();
- System.out.println(((mod == 0) ? ""
- : (Modifier.toString(mod) + " "))
- + getTypeName(f.getType()) + " " + f.getName());
- }
- System.out.println("------------------------------------------------");
- //获取定义的方法
- Method[] methods = c.getDeclaredMethods();
- System.out.println(className + " 类包含的方法有:");
- StringBuffer sb = new StringBuffer();
- for (Method m : methods) {
- int mod = m.getModifiers();
- if (mod != 0) {
- //得到访问控制修饰符
- sb.append(Modifier.toString(mod) + " ");
- }
- sb.append(getTypeName(m.getReturnType()) + " ");
- sb.append(m.getName() + "(");
- Class[] params = m.getParameterTypes();
- for (int j = 0; j < params.length; j++) {
- sb.append(getTypeName(params[j]));
- if (j < (params.length - 1))
- sb.append(",");
- }
- sb.append(")");
- System.out.println(sb.toString());
- sb.delete(0, sb.length());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 此方法来自java.lang.reflect.Field
- * @param type
- * @return
- */
- @SuppressWarnings("unchecked")
- private static String getTypeName(Class type) {
- if (type.isArray()) {//如果是数组类型
- try {
- Class cl = type;
- int dimensions = 0; //数组的维度
- while (cl.isArray()) {
- dimensions++;
- cl = cl.getComponentType();
- }
- StringBuffer sb = new StringBuffer();
- sb.append(cl.getName());
- for (int i = 0; i < dimensions; i++) {
- sb.append("[]");
- }
- return sb.toString();
- } catch (Throwable e) { /*FALLTHRU*/
- }
- }
- return type.getName();
- }
- }
在制作这个例子的时候参考了java.lang.reflect.Method.toString() 方法 和java.lang.reflect.Field.toString()方法。
今天先来个简单的例子,下一篇将介绍如何利用反射机制。最常用的就是 从request 到pojo的属性拷贝,以及两个JavaBean之间的属性复制