Java反射获取实体的所有可见属性值,返回Object数组

获取实体的所有可见属性值

以下代码提供了两种实现,一种是基于List,一种是基于Map; 基于List的实现更节省内存,更高效一些;如果你有其它特殊的需求,可以根据实际参考以下代码进行扩展,或许有需要用到Map的情况呢!

当然,使用BeanUtils.describe或PropertyUtils.describe一两句代码就搞定了,但还需要额外添加包引用;另外效率方面是不是更高呢?我没有做过测试。

/**
   * 获取实体的所有可见属性值
   * @param object 实体类的实例
   * @return 返回一个Object数组,该数组包含实体的所有可见属性值
   */
  public Object[] getFieldValues(Object object) {
        if (object == null)
            return null;
        Field[] fields = object.getClass().getDeclaredFields();
        List<Object> fieldValueList = new ArrayList<Object>();
        //Map<String, Object> fieldValueMap = new HashMap<String, Object>();

        try {
            for (Field f : fields) {
                if (f.getModifiers() > 2) {
                    continue;
                }
                fieldValueList.add(f.get(object));
                //fieldValueMap.put(f.getName(), f.get(object));
            }
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return fieldValueList.toArray();
        //return fieldValueMap.values().toArray();
    }

本例中使用getDeclaredFields,你可以参考与getFields区别,根据实际需求决定到底使用哪一个;

BeanUtils.describe实现本例的功能

BeanUtils.describe(object).values().toArray();

经过测试,该方法与本例代码返回的结果并不相同;

getFields()和getDeclaredFields()的区别

getFields()获得某个类的所有的公共(public)的字段,包括父类。

getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段。

同样类似的还有getConstructors()和getDeclaredConstructors(),getMethods()和getDeclaredMethods()。

BeanUtils.describe与PropertyUtils.describe区别

这两个方法,基本上实现原理类似,内部代码很多都相同的,但在读取bean的某个属性的时候都是调用的某个类的getNestedProperty(bean, name)方法。

其实主要的区别就在这个方法中

PropertyUtils是调用的PropertyUtilsBean的这个方法,该方法读取属性值(调用getXxx方法)之后,value不做转化

而BeanUtils调用的是BeanUtilsBean的这个getNestedProperty方法,该方法在读取值之后,会再调用一次(getConvertUtils().convert(value));,进行类型转化成String。

因此BeanUtils.describe转化出来的Map的value都是String

BeanUtils.describe方法实现

  public Map describe(Object paramObject)
    throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
  {
    if (paramObject == null)
      return new HashMap();
    if (this.log.isDebugEnabled())
      this.log.debug("Describing bean: " + paramObject.getClass().getName());
    HashMap localHashMap = new HashMap();
    Object localObject;
    if (paramObject instanceof DynaBean)
    {
      localObject = ((DynaBean)paramObject).getDynaClass().getDynaProperties();
      for (int i = 0; i < localObject.length; ++i)
      {
        String str1 = localObject[i].getName();
        localHashMap.put(str1, getProperty(paramObject, str1));
      }
    }
    else
    {
      localObject = getPropertyUtils().getPropertyDescriptors(paramObject);
      Class localClass = paramObject.getClass();
      for (int j = 0; j < localObject.length; ++j)
      {
        String str2 = localObject[j].getName();
        if (getPropertyUtils().getReadMethod(localClass, localObject[j]) == null)
          continue;
        localHashMap.put(str2, getProperty(paramObject, str2));
      }
    }
    return (Map)localHashMap;
  }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 16:07:54

Java反射获取实体的所有可见属性值,返回Object数组的相关文章

通过反射获取某个对象下的属性值,或通过父类获取

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; /** * 通过反射获取某个对象下的属性值,或通过父类获取 * User: wangyongfei * Date

java利用映射表名称反射创建实体类并赋属性值

1.hibernate中首先进行初始化,将对应的表名和类名以键值对的方式存放到map中 private Map<String, String> mappings;//全局变量 /** * 根据数据库表名获取实体类 */ public void initMappings() { if (mappings == null) { mappings = new HashMap<String, String>(); SessionFactory factory = this.getSessi

java 反射: 当Timestamp类型的属性值为null时,设置默认值

import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.Timestamp; class Person { private String name; private int age; private Timestamp birth; public Timestamp getBirth() { return birth

java 反射获取设置私有成员变量的值

for (Object arg:args) { //处理applicationCode Class<?> argClass = arg.getClass(); Field applicationCode =null; try { applicationCode =argClass.getDeclaredField("applicationCode"); }catch (NoSuchFieldException e){ } JWTData jwtData = CurrentU

Java反射获取对象VO的属性值(通过Getter方法)

有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个Excel导出的工具类,导出的批量数据是以List类型传入的,List里的对象自然每次都不同,这取决于需要导出什么信息. 为了使用方便,将对象的属性名与属性值存于Map当中,使用时就可以直接遍历Map了. 此次的思路是通过反射和Getter方法取得值,然后记录在一个Map当中. Kick start

通过Java反射做实体查询

我们在使用hibernate的时候,查询的时候都会和实体中的一些字段相结合去查询,当然字段少了,还算是比较简单,当字段多了,就不那么容易了,所以就自己写了个方法,根据实体中的字段信息去查询,废话不多说上代码: /** * 根据实体查询,将所有的参数封装到实体中查询即可,不可查询为null的信息 * @param t * @return * @throws SecurityException * @throws NoSuchMethodException * @throws IllegalArgu

Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理

1.Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理 2. 自定义注解: 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节.在定义注解时,不能继承其他的注解或接口.@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数.方法的名称就是参数的名称,返回值类型就是参数的类型(返回

Java中对比两个对象中属性值[反射、注解]

在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪一个属性的值被修改了.然后Java中只能获取属性的名称,也就是英文标识的属性名,但是一般我们都会在属性后面添加属性的注释,但是Java不提供注释获取的方法.所以我们只能使用另外一种方式来将属性和属性注释关联起来,这就是Java中的@Annotation. public static  Map<Str

通过java反射获取任意对象的字段名及字段值

import java.lang.reflect.Field; public class ReflectClass3 { /** * @param args */ public static void main(String[] args) { Person p = new Person(1, "ctl", true, 'c', 2.0f, 2.0, 1L, (short) 1, (byte) 1); p.setId(0); p.setName("张三"); p.s