找回密码
 快速注册

QQ登录

只需一步,快速开始

查看: 1141|回复: 0

JAVA 私塾笔记整理——反射机制(Reflection)

[复制链接]
solimh 发表于 2011-4-15 10:15:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?快速注册

×
JAVA 私塾笔记整理——反射机制(Reflection)

一.反射是什么?
  反射它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。

二.分析类的构成?
1.获取Class对象:
   Class c = Class.forName("java.lang.String");
   Class c = int.class;
   Class c = Integer.TYPE;
      *它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如Integer) 中预先定义好的 TYPE 字段。
2.获取类的方法

  1. package cn;
  2. import java.lang.reflect.*;
  3. public class Test {
  4.   ∵ int f1(Object p, int x) throws NullPointerException {
  5.     if (p == null)
  6.       throw new NullPointerException();
  7.     return x;
  8.   }
  9.   public static void main(String args[]) {
  10.     try {
  11.       Class cls = Class.forName("cn.Test");
  12.       Method methlist[] = cls.getDeclaredMethods();
  13.       for (int i = 0; i < methlist.length; i++) {
  14.         Method m = methlist[i];
  15.         System.out.println("name = " + m.getName());
  16.         System.out.println("decl class = " + m.getDeclaringClass());
  17.         Class pvec[] = m.getParameterTypes();
  18.         for (int j = 0; j < pvec.length; j++)
  19.           System.out.println("param #" + j + " " + pvec[j]);
  20.         Class evec[] = m.getExceptionTypes();
  21.         for (int j = 0; j < evec.length; j++)
  22.           System.out.println("exc #" + j + " " + evec[j]);
  23.         System.out.println("return type = " + m.getReturnType());
  24.         System.out.println("-----");
  25.        }
  26.      } catch (Throwable e) {
  27.         System.err.println(e);
  28.     }
  29.   }
  30. }
复制代码
输出的结果如下:
  name = f1
  decl class = class cn.Test
  param #0 class java.lang.Object
  param #1 int
  exc #0 class java.lang.NullPointerException
  return type = int
  -----
  name = main
  decl class = class cn.Test
  param #0 class [Ljava.lang.String;
  return type = void
  -----

3. 获取构造器

  1. package cn;
  2. import java.lang.reflect.*;
  3. public class Test {
  4.   public Test() {}
  5.   protected Test(int i, double d) {
  6.   }
  7.   public static void main(String args[]) {
  8.     try {
  9.       Class cls = Class.forName("cn.Test");
  10.       Constructor ctorlist[] = cls.getDeclaredConstructors();
  11.       for (int i = 0; i < ctorlist.length; i++) {
  12.         Constructor ct = ctorlist[i];
  13.         System.out.println("name = " + ct.getName());
  14.         System.out.println("decl class = " +
  15.         ct.getDeclaringClass());
  16.         Class pvec[] = ct.getParameterTypes();
  17.         for (int j = 0; j < pvec.length; j++)
  18.           System.out.println("param #" + j + " " + pvec[j]);
  19.         Class evec[] = ct.getExceptionTypes();
  20.         for (int j = 0; j < evec.length; j++)
  21.           System.out.println("exc #" + j + " " + evec[j]);
  22.         System.out.println("-----");
  23.       }
  24.     } catch (Throwable e) {
  25.        System.err.println(e);
  26.     }
  27.   }
  28. }
复制代码
这个程序运行的结果是:
name = cn.Test
decl class = class cn.Test
-----
name = cn.Test
decl class = class cn.Test
param #0 int
param #1 double
-----

4. 获取类的属性字段(域字段)

  1. package cn;
  2. import java.lang.reflect.*;
  3. public class Test {
  4.   ∵ double d;
  5.   public static final int i = 37;
  6.   String s = "testing";
  7.   public static void main(String args[]) {
  8.     try {
  9.       Class cls = Class.forName("cn.Test");
  10.       Field fieldlist[] = cls.getDeclaredFields();
  11.       for (int i = 0; i < fieldlist.length; i++) {
  12.         Field fld = fieldlist[i];
  13.         System.out.println("name = " + fld.getName());
  14.         System.out.println("decl class = " + fld.getDeclaringClass());
  15.         System.out.println("type = " + fld.getType());
  16.         int mod = fld.getModifiers();
  17.         System.out.println("modifiers = " + Modifier.toString(mod));
  18.         System.out.println("-----");
  19.       }
  20.     } catch (Throwable e) {
  21.       System.err.println(e);
  22.     }
  23.   }
  24. }
复制代码
这个程序的输出是:
name = d
decl class = class cn.Test
type = double
modifiers = ∵
-----
name = i
decl class = class cn.Test
type = int
modifiers = public static final
-----
name = s
decl class = class cn.Test
type = class java.lang.String
modifiers =
-----

三.如何动态调用
   (要动态调用就要创建实例)
    Class cls = Class.forName("cn.Test");
    Object obj = cls.newInstance();
    *使用反射机制的主流框架都是默认调用无参的public构造器,所以我们不能改类的构造器。

四.设计实现javaBean功能

  1. import java.lang.reflect.Field;
  2. import java.lang.reflect.Method;
  3. import java.util.HashMap;
  4. import java.util.Map;

  5. public class JavaBean {
  6.    ∵ static Object  myJavaBean(Map map,Class cls) throws Exception{
  7.     //得到类中所有字段
  8.     Field fs[] = cls.getDeclaredFields();
  9.     //new 一个实例
  10.     Object obj = cls.newInstance();
  11.     for(int i=0;i<fs.length;i++){
  12.       //得到字段名
  13.       Object v = map.get(fs[i].getName());
  14.       if(v!=null){
  15.         //只有一个参数
  16.         Class partypes[] = new Class[1];
  17.         partypes[0] = fs[i].getType();  
  18.         //拼setter方法
  19.         Method meth = cls.getMethod("set"
  20.         + fs[i].getName().substring(0,1).toUpperCase()
  21.         + fs[i].getName().substring(1), partypes);
  22.         Object arglist[] = new Object[1];
  23.         arglist[0] = v;
  24.         meth.invoke(obj, arglist);
  25.       }
  26.     }
  27.     return obj;
  28.   }
  29.   
  30.   public static void main(String[] args) throws Exception {
  31.     Map map = new HashMap();
  32.     map.put("userId", "1234");
  33.     map.put("name", "4321");
  34.     map.put("ddd", "dddd dddd");
  35.     Object obj = myJavaBean(map,AModel.class);
  36.     AModel am = (AModel)obj;
  37.     System.out.println("am.userId=" + am.getUserId() + ",name=" + am.getName());
  38.   }
  39. }

  40. class AModel{
  41.   ∵ String userId,name;
  42.   public String getUserId() {
  43.     return userId;
  44.   }
  45.   public void setUserId(String userId) {
  46.     this.userId = userId;
  47.   }
  48.   public String getName() {
  49.     return name;
  50.   }
  51.   public void setName(String name) {
  52.     this.name = name;
  53.   }
  54. }
复制代码
这个程序的输出是:
      am.userId=1234,name=4321

JAVA 私塾经典学习视频,可以到官网下载观看,w ww.javass.cn
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表