java - java中通过名称获取字段值

标签 java reflection

我需要读取给定字段名称的字段值。假设我有一个名为product的类,它有字段:大小、图像、链接..并且有 getSize()、getImage() 和 getLink() 等方法来读取这些值。现在,如果我给出“大小”,我想通过调用 getSize() 来获取大小,给定“图像”,通过调用 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;
      .... 

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

最佳答案

除了反射或显式切换(如您所拥有的)之外,唯一真正的选择是根本不具有这些字段。您可以只使用通用的 getAttribute(Attribute a),而不是 getSize()getImage() 等。 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() 相同(假设枚举值和方法是“当然,t 已定义)。

关于java - java中通过名称获取字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24437312/

相关文章:

java - 从数组列递归获取字符串

java - 从 DB 推送到 Java 客户端的数据异步连续轮询

java - 使用 AndEngine 的加速器传感器方向

c# - 使用具有强类型方法的类型对象

java - 动态地将Object实例转换为真正的子类实例

java - 获取 mouseReleased 下的组件

java - JList 右键显示菜单(使用、删除、取消)

c# - InternalsVisibleTo - 如何防止某人创建具有相同名称的程序集并访问内部类或方法?

Java 泛型 - 转换泛型类时出错

c# - 如何判断一个类是否实现了具有泛型类型的接口(interface)