// 通过反射获取对象的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;
}
}