在java中按名称获取字段值

时间:2014-06-26 18:06:46

标签: java reflection

我需要在给定字段名称的情况下读取字段值。假设我有一个名为product的类,它有字段:size,image,link ..并且有getSize(),getImage()和getLink()等方法来读取这些值。现在如果我给出' size',我希望通过调用getSize()获得大小,给定' image',通过调用getImage()来获取图像......

现在我有一个笨拙的代码调用getField(String fieldName)来处理这个:

public void String getField(String fieldName, Product p) {
   String value = "";
   swtich(fieldName):
      case 'size':
         value = p.getSize();
         break;
      case 'image':
         value = p.getImage();
         break;
      .... 

问题是这个类中有太多字段,整个代码看起来很难看。我也试图避免反射页面,因为可读性差。还有其他想法可以很好地处理这个问题吗?感谢

2 个答案:

答案 0 :(得分:1)

除了反射或显式切换(如你所知)之外,唯一真正的替代方案是根本没有那些字段。您可以只使用通用getSize(),而不是getImage()getAttribute(Attribute a)等。 Attribute可能会有一个enum。类似的东西:

enum Attribute { SIZE, IMAGE, ... }

public class Product {
    Map<Attribute, String> attributes = new EnumMap<>(Attribute.class);

    public String getAttribute(Attribute attribute) {
        return attributes.get(attribute);
    }

    public void setAttribute(Attribute attribute, String value) {
        attributes.put(attribute, value);
    }

    ...
}

EnumMap非常有效,所以这段代码会很快 - 不像真实字段那么快,但在你的应用中可能没有明显的慢。

使Attribute成为enum(而不仅仅是拥有String属性键)的原因是它为您提供与显式getter函数相同的类型安全性。例如,p.getAttribute(Attribute.NOT_A_REAL_ATTRIBUTE)将产生编译时错误,与p.getNotARealAttribute()相同(假设当前没有定义枚举值和方法)。

答案 1 :(得分:0)

您可以考虑直接使用属性名称作为地图和值的键作为属性。

HashMap<String, Object> attributes

因此,如果添加新属性,您不必修改结构或枚举。

小心,&#34;尺寸&#34;和&#34;尺寸&#34;将表现得不同。