动态场和/或人工方法

时间:2012-01-13 14:13:09

标签: java dynamic methods field

我使用动态Dataset模型,其中(简而言之)接受属性并将其存储在Map中,就像这样......

Dataset dataset = new Dataset();
dataset.setAttribute("name", "value");

...以便以后恢复,就像这样...

String value = dataset.getAttribute("name");

......这对我的目的来说非常有用。但现在我在一个我想使用模板引擎来动态生成HTML的地方。在模板中,我做了很多${dataset.getAttribute("name")}并不理想。如果我可以在Dataset添加某些内容时创建人工方法,那将是相当不错的。例如,如果我这样做......

dataset.setAttribute("name", "value");

...我希望能够像这样检索它......

String name;
name = dataset.name;
//or
name = dataset.getName();

...但到目前为止我还没能把它拉下来。我可以采取什么方法?它甚至可行吗?

修改:

我知道Velocity提供Property Lookup Rules尝试解析dataset.namedataset.get("name"),这很好,但我需要知道如何在Velocity 的情况下实现这一点也不是目标。

4 个答案:

答案 0 :(得分:1)

请参阅http://velocity.apache.org/engine/releases/velocity-1.5/user-guide.html#propertylookuprules

如果您的方法名为get(String attribute)而不是getAttribute(String attribute),则可以使用与常规属性相同的语法。因此,要么重构您的课程,要么添加与get完全相同的其他getAttribute方法,或将您的对象转换为Map,其中get方法

答案 1 :(得分:0)

您可以将Dynamic Spring代理与AOP技术或CGLib代理一起使用。 AOP可用于描述这样的getter:execution(public * com.bla.YourClass.get*())")

答案 2 :(得分:0)

过去我用Objectweb的ASM动态生成了POJO。这样做的好处是,基础字段类型安全且效率更高(尤其是私有值)

答案 3 :(得分:0)

从我看到的情况来看,Java的模板引擎支持

是相当普遍的
  • getAttribute
  • 形式的getter / setters
  • Map接口的实现

在您花费太多时间寻找更通用的解决方案之前(假设上面的内容不会像在Velocity中那样受到支持),可能值得看看其他引擎,看看是否有任何一个没有支持它。如果所有可能的目标都有,那么你可能很好地依赖它。

在您花时间解决问题之前,我非常喜欢确保您确实遇到问题。