详解Java如何获取对象属性及对应值

利用反射获取对象的所有属性及对应的值

1、获取属性名数组

private static String[] getFiledName(Object o) {
    Field[] fields = o.getClass().getDeclaredFields();
    String[] fieldNames = new String[fields.length];
    for (int i = 0; i < fields.length; i++) {
      fieldNames[i] = fields[i].getName();
    }
    return fieldNames;
  }

2、根据属性名获取属性值

private static 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) {
      logger.error("获取属性值失败!" + e, e);
    }
    return null;
  }

3、获取属性的数据类型

private static Object getFiledType(String fieldName, Object o) {
    Field[] fields = o.getClass().getDeclaredFields();
    for (Field field : fields) {
      if (Objects.equals(fieldName, field.getName())) {
        return field.getType();
      }
    }
    return null;
  }

4、完整代码及其引入的包

package com.hao.search;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Joiner;

public class ObjectPaseUtils {

  private static Logger logger = LoggerFactory.getLogger(ObjectPaseUtils.class);

  /**
   * @desc 将对象转换成指定String
   * @param <T>
   * @param t
   * @return
   */
  public static <T> String objectToStr(T t) {
    List<String> list = new ArrayList<String>();
    String[] fieldNames = getFiledName(t);
    for (int i = 0; i < fieldNames.length; i++) {
      String name = fieldNames[i];
      Object value = getFieldValueByName(name, t);
      if (null != value) {
        if (getFiledType(name, t).equals(Date.class)) {
          value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date)value);
        }
        list.add(name + " : " + value);
      }
    }
    if (CollectionUtils.isNotEmpty(list)) {
      return Joiner.on("\r").skipNulls().join(list);
    }
    return null;
  }

  /**
   * @desc 获取属性名数组
   * @param o
   * @return
   */
  private static String[] getFiledName(Object o) {
    Field[] fields = o.getClass().getDeclaredFields();
    String[] fieldNames = new String[fields.length];
    for (int i = 0; i < fields.length; i++) {
      fieldNames[i] = fields[i].getName();
    }
    return fieldNames;
  }

  /**
   * @desc 根据属性名获取属性值
   * @param fieldName
   * @param o
   * @return
   */
  private static 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) {
      logger.error("获取属性值失败!" + e, e);
    }
    return null;
  }

  /**
   * @desc 获取属性的数据类型
   * @param fieldName
   * @param o
   * @return
   */
  private static Object getFiledType(String fieldName, Object o) {
    Field[] fields = o.getClass().getDeclaredFields();
    for (Field field : fields) {
      if (Objects.equals(fieldName, field.getName())) {
        return field.getType();
      }
    }
    return null;
  }

}

最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:11604713672

猜你喜欢

转载自blog.csdn.net/weixin_51495453/article/details/112536720
今日推荐