浅析JAVA反射(一)

Java Reflection (JAVA反射)  
Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。
Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。
JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。

像Struts2.0 Hibernate Spring 都是利用了这一特性。

下面先看一个简单例子 打印一个类里面的属性和方法,代码比较简单,在这里久不解释了,运行一下看看结果就明白了。

  1. import java.lang.reflect.Field;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Modifier;
  4. public class Test {
  5.     public static void main(String[] args) {
  6.         show("java.util.Date");
  7.     }
  8.     /**
  9.      * 打印一个类里面定义的属性和方法
  10.      * @param className
  11.      */
  12.     @SuppressWarnings("unchecked")
  13.     private static void show(String className) {
  14.         try {
  15.             Class c = Class.forName(className);
  16.             //获取定义的属性
  17.             Field[] fields = c.getDeclaredFields();
  18.             System.out.println(className + " 类包含的属性有:");
  19.             for (Field f : fields) {
  20.                 int mod = f.getModifiers();
  21.                 System.out.println(((mod == 0) ? ""
  22.                         : (Modifier.toString(mod) + " "))
  23.                         + getTypeName(f.getType()) + " " + f.getName());
  24.             }
  25.             System.out.println("------------------------------------------------");
  26.             //获取定义的方法
  27.             Method[] methods = c.getDeclaredMethods();
  28.             System.out.println(className + " 类包含的方法有:");
  29.             StringBuffer sb = new StringBuffer();
  30.             for (Method m : methods) {
  31.                 int mod = m.getModifiers();
  32.                 if (mod != 0) {
  33.                     //得到访问控制修饰符
  34.                     sb.append(Modifier.toString(mod) + " ");
  35.                 }
  36.                 sb.append(getTypeName(m.getReturnType()) + " ");
  37.                 sb.append(m.getName() + "(");
  38.                 Class[] params = m.getParameterTypes();
  39.                 for (int j = 0; j < params.length; j++) {
  40.                     sb.append(getTypeName(params[j]));
  41.                     if (j < (params.length - 1))
  42.                         sb.append(",");
  43.                 }
  44.                 sb.append(")");
  45.                 System.out.println(sb.toString());
  46.                 sb.delete(0, sb.length());
  47.             }
  48.         } catch (Exception e) {
  49.             e.printStackTrace();
  50.         }
  51.     }
  52.     /**
  53.      * 此方法来自java.lang.reflect.Field
  54.      * @param type
  55.      * @return
  56.      */
  57.     @SuppressWarnings("unchecked")
  58.     private static String getTypeName(Class type) {
  59.         if (type.isArray()) {//如果是数组类型
  60.             try {
  61.                 Class cl = type;
  62.                 int dimensions = 0//数组的维度
  63.                 while (cl.isArray()) {
  64.                     dimensions++;
  65.                     cl = cl.getComponentType();
  66.                 }
  67.                 StringBuffer sb = new StringBuffer();
  68.                 sb.append(cl.getName());
  69.                 for (int i = 0; i < dimensions; i++) {
  70.                     sb.append("[]");
  71.                 }
  72.                 return sb.toString();
  73.             } catch (Throwable e) { /*FALLTHRU*/
  74.             }
  75.         }
  76.         return type.getName();
  77.     }
  78. }

在制作这个例子的时候参考了java.lang.reflect.Method.toString() 方法 和java.lang.reflect.Field.toString()方法。

今天先来个简单的例子,下一篇将介绍如何利用反射机制。最常用的就是 从request 到pojo的属性拷贝,以及两个JavaBean之间的属性复制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值