2010-06-07 70 views

回答

91

您可以使用Class#getDeclaredFields()获取该类的所有声明字段。您可以使用Field#get()来获取该值。

简而言之:

Object someObject = getItSomehow(); 
for (Field field : someObject.getClass().getDeclaredFields()) { 
    field.setAccessible(true); // You might want to set modifier to public first. 
    Object value = field.get(someObject); 
    if (value != null) { 
     System.out.println(field.getName() + "=" + value); 
    } 
} 

要了解更多关于反思,检查Sun tutorial on the subject


这就是说,场不一定所有代表VO的性质。您宁愿确定以getis开头的公共方法,然后调用它以获取实际属性值。

for (Method method : someObject.getClass().getDeclaredMethods()) { 
    if (Modifier.isPublic(method.getModifiers()) 
     && method.getParameterTypes().length == 0 
     && method.getReturnType() != void.class 
     && (method.getName().startsWith("get") || method.getName().startsWith("is")) 
    ) { 
     Object value = method.invoke(someObject); 
     if (value != null) { 
      System.out.println(method.getName() + "=" + value); 
     } 
    } 
} 

这反过来说,有可能是解决您最实际的问题更优雅的方式。如果您详细阐述您认为这是正确的解决方案的功能要求,那么我们可能会提出正确的解决方案。有很多,许多工具可用于按摩javabeans。

+0

如果我有修改字段i的值n对象?修改gte当前值执行某些操作,然后将其添加回Object? – 2017-11-29 09:18:49

1

我有一个对象(基本上是VO)在 Java中,我不知道它的类型。我需要获得那个对象中不为null的值。

也许你该做的没有必要需要反思 - 这里是一个纯面向对象的设计可能会解决你的问题:

  1. 添加的接口Validation其暴露的方法validate,它检查字段并返回适当的内容。
  2. 实现所有VO的接口和方法。
  3. 当你得到一个VO,即使它是具体类型是未知的,你可以将它转换为Validation并检查。

我想你需要的字段是null以通用的方式显示错误消息,所以这应该足够了。让我知道如果出于某种原因这对你不起作用。

10

下面是一个快速和肮脏的方法,以通用的方式做你想做的事情。您需要添加异常处理,并且您可能需要将BeanInfo类型缓存在弱散列映射中。

public Map<String, Object> getNonNullProperties(final Object thingy) { 
    final Map<String, Object> nonNullProperties = new TreeMap<String, Object>(); 
    try { 
     final BeanInfo beanInfo = Introspector.getBeanInfo(thingy 
       .getClass()); 
     for (final PropertyDescriptor descriptor : beanInfo 
       .getPropertyDescriptors()) { 
      try { 
       final Object propertyValue = descriptor.getReadMethod() 
         .invoke(thingy); 
       if (propertyValue != null) { 
        nonNullProperties.put(descriptor.getName(), 
          propertyValue); 
       } 
      } catch (final IllegalArgumentException e) { 
       // handle this please 
      } catch (final IllegalAccessException e) { 
       // and this also 
      } catch (final InvocationTargetException e) { 
       // and this, too 
      } 
     } 
    } catch (final IntrospectionException e) { 
     // do something sensible here 
    } 
    return nonNullProperties; 
} 

见这些引用:

相关问题