2013.9.13 java反射机制 练习实例

// 通过反射获取对象的get方法和值
Map<String, Object> modelValues = new HashMap<String, Object>();
Method[] methods = model.getClass().getDeclaredMethods();
for (Method method : methods) {
String methodName = method.getName();
if (methodName.startsWith("getPms")) {
Object obj = method.invoke(model);


if (!(obj == null || "null".equals(obj))) {


String attrName = methodName.replace("getPms_", ""); // 属性名
json.put(attrName, obj);
modelValues.put(attrName, obj);
}
}
}


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

/**
 * @author Pant
 * @version 创建时间:2013-9-13 上午11:27:37
 */

public class Main {

 /**
  * @param args
  */
 public static void main(String[] args) {
  /** 根据对象,通过反射调用对象的属性及方法 */
  User u = new User();
  User us = (User) getMethod(u);
  System.out.println(us);

  /** 根据类名,通过反射机制生成对象,并访问其属性和方法 */
  Object object = getMethod("User");
  /** 调用自定义getMethod(object)方法 */
  User uss = (User) getMethod(object);
  System.out.println(uss);
 }

 /**
  * 根据类名生成对应的类 的对象
  *
  * @param className
  * @return
  */
 private static Object getMethod(String className) {
  Object obj = null;
  try {
   /**
    * 如果构造方法不需要参数,可以直接使用class.newInstance()来实现。
    * 否则:通过如下方式获取 
    * 1.根据参数值,构造参数类型列表
    * Class[] paramTypes = new Class[params.length];
    *  for(int i=0;i<params.length;i++) {
    *  paramTypes[i] = params[i].getClass();
    * }
    * 2.获取构造方法
    * Constructor conn = c.getConstructor(paramTypes);
    * 3.传值,执行构造方法
    * Object object = conn.newInstance(params); 
    * 
    *
    * */
   Class c = Class.forName(className);
   /** 通过Class调用声明的空的构造函数 */
   obj = c.newInstance();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch (InstantiationException e) {
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  }
  return obj;
 }

 /**
  * 获取对象 通过反射的方式调用该对象的set方法,构建一个不为空的对象
  *
  * @param u
  * @return
  */
 static Object getMethod(Object u) {
  // Field field = c.getField("name");// 通过class得到类声明的属性
  // Object property = field.get(u); // 通过对象得到该属性的实例,如果该属性是非公有的,则会报错
  Class c = u.getClass();// 取得该对象的class
  Field[] fields = c.getDeclaredFields();// 获取所有属性
  for (Field f : fields) {
   String name = f.getName();
   String methodName = "set" + name.substring(0, 1).toUpperCase()
     + name.substring(1);
   /**
    * methodName : 将要调用的方法名称 f.getType(): 属性值的类型,参数类型 u : 对象 "pant" : 值
    * 调用对象u的methodName方法,参数 类型是 f.getType(),参数是 “pant”
    * */
   Method method;
   try {
    method = c.getMethod(methodName, f.getType());
    if (f.getType().getName().contains("String")) {
     method.invoke(u, "pant");
    } else if (f.getType().getName().contains("Date")) {
     method.invoke(u, new Date());
    } else if (f.getType().getName().contains("int")) {
     method.invoke(u, 24);
    }
   } catch (SecurityException e) {
    e.printStackTrace();
   } catch (NoSuchMethodException e) {
    e.printStackTrace();
   } catch (IllegalArgumentException e) {
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    e.printStackTrace();
   } catch (InvocationTargetException e) {
    e.printStackTrace();
   }
  }
  return u;
 }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来的我比现在的我更优秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值