【问题标题】:add property for a object dynamicly动态添加对象的属性
【发布时间】:2010-12-01 18:55:02
【问题描述】:

嗨: 在我们的应用程序中,我们从数据库中检索了一些数据,例如,表有列:id、name、age、address、email。

然后我们会根据客户来获取其中的一些属性。

如果客户需要id、name,我们得到id name,如果客户需要id、name、age,我们得到id、name、age。

现在我们要创建一个类来包装这些属性。但是,我们并不确切知道请求的是哪个字段。

String[] requestPro={"name","id"}; //this field is specified by client
Map<String, Object> map=new HashMap<String, Object>();
Entity en=Entity.newInstance();
for(String p:requestPro){
    map.put(p, BeanUtils.getProperty(en, p));
}

这里可以用类替换地图吗?

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    如果我的理解正确,您希望动态地将属性添加到类,或者更确切地说:添加到类的特定实例。

    前者是可能的,例如在 Groovy 中,每个类都有一个元类对象,您可以在运行时为其分配行为,后者在 JavaScript 中是可能的,您可以将行为分配给对象的原型和对象本身。但是这两个版本在 Java 中都不可能,所以在 Java 中使用 Map 或类似结构是要做的事情。

    【讨论】:

    • 您可以在 Java 中执行此操作。在此处查看方法:stackoverflow.com/questions/2215536/java-dynamic-properties
    • @HDave 有趣,该问题的两个最重要的答案说它无法完成。而 Pascal 的答案只适用于 CGLib,一个字节码操作库。所以,如果你准备好动态修改类并篡改类加载器,那么你可以用 Java 来做。但几乎没有人这样做,这是有原因的。这是hacky和容易出错的。 groovy 元类方法更清洁、更安全。
    • 我认为可以通过子类化 Object 来给它一个从 String 到对象子类的额外 HashMap 映射。然后您可以通过子类方法添加属性,例如 addEntry 和 removeEntry。它需要反射来处理基于每个对象的每个对象,但这还不错,因为你知道它们是什么,只是看起来很难看。
    猜你喜欢
    • 1970-01-01
    • 2022-09-27
    • 2015-12-12
    • 2014-05-29
    • 2012-01-12
    • 2011-10-05
    • 2017-10-14
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多