要获取对象的所有属性可以使用getDeclaredFields()
方法会返回一个Field
数组
遍历这个数组几个遍历所有属性
注意使用这个方法会抛出4个异常
然后根据属性的类型选择执行对应的内容
public static void eachProperties(Object model) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Field[] field = model.getClass().getDeclaredFields(); //获取实体类的所有属性,返回Field数组
for(int j=0 ; j<field.length ; j++){ //遍历所有属性
String name = field[j].getName(); //获取属性的名字
System.out.println("attribute name:"+name);
name = name.substring(0,1).toUpperCase()+name.substring(1); //将属性的首字符大写,方便构造get,set方法
String type = field[j].getGenericType().toString(); //获取属性的类型
if(type.equals("class java.lang.String")){ //如果type是类类型,则前面包含"class ",后面跟类名
...
}
if(type.equals("class java.lang.Integer")){
...
}
if(type.equals("class java.lang.Short")){
...
}
if(type.equals("class java.lang.Double")){
...
}
if(type.equals("class java.lang.Boolean")){
...
}
if(type.equals("class java.util.Date")){
...
}
}
}
具体执行的内容就是重点了
我们知道模型的属性都会有对应的getter和setter方法
只需要得到对应的getter和setter方法即可获取和设置属性
这里就需要用到getMethod
方法
获得getter方法
方法有分带参数和不带参数,我们知道getter方法是不带参数的
获得getter方法如下
Method m = model.getClass().getMethod("get"+name);
获得setter方法
如果是带参数的setter方法,就应该把参数的类型做封装成一个Class<?>泛型数组传入getMethod
方法的第二个参数
例如参数是String类型的setter方法如下
Method m = model.getClass().getMethod("set"+name, new Class[] {String.class});
执行getter方法
String value = (String) m.invoke(model);
执行setter方法
m.invoke(model,new Object[] {new String("new value")});
下面是网上一些朋友包装好的javabean反射方法:
/**
* 根据属性名获取属性值
* */
private Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[] {});
Object value = method.invoke(o, new Object[] {});
return value;
} catch (Exception e) {
log.error(e.getMessage(),e);
return null;
}
}
/**
* 获取属性名数组
* */
private String[] getFiledName(Object o){
Field[] fields=o.getClass().getDeclaredFields();
String[] fieldNames=new String[fields.length];
for(int i=0;i<fields.length;i++){
System.out.println(fields[i].getType());
fieldNames[i]=fields[i].getName();
}
return fieldNames;
}
/**
* 获取属性类型(type),属性名(name),属性值(value)的map组成的list
* */
private List getFiledsInfo(Object o){
Field[] fields=o.getClass().getDeclaredFields();
String[] fieldNames=new String[fields.length];
List list = new ArrayList();
Map infoMap=null;
for(int i=0;i<fields.length;i++){
infoMap = new HashMap();
infoMap.put("type", fields[i].getType().toString());
infoMap.put("name", fields[i].getName());
infoMap.put("value", getFieldValueByName(fields[i].getName(), o));
list.add(infoMap);
}
return list;
}
/**
* 获取对象的所有属性值,返回一个对象数组
* */
public Object[] getFiledValues(Object o){
String[] fieldNames=this.getFiledName(o);
Object[] value=new Object[fieldNames.length];
for(int i=0;i<fieldNames.length;i++){
value[i]=this.getFieldValueByName(fieldNames[i], o);
}
return value;
}