Java 动态场和/或人工方法

Java 动态场和/或人工方法,java,dynamic,methods,field,Java,Dynamic,Methods,Field,我使用的是一个动态的数据集模型,它(简而言之)接收属性并将它们存储在映射中,如下所示 Dataset dataset = new Dataset(); dataset.setAttribute("name", "value"); String value = dataset.getAttribute("name"); String name; name = dataset.name; //or name = dataset.getName(); …为了以后的恢复,像这样 Dataset d

我使用的是一个动态的
数据集
模型,它(简而言之)接收属性并将它们存储在
映射
中,如下所示

Dataset dataset = new Dataset();
dataset.setAttribute("name", "value");
String value = dataset.getAttribute("name");
String name;
name = dataset.name;
//or
name = dataset.getName();
…为了以后的恢复,像这样

Dataset dataset = new Dataset();
dataset.setAttribute("name", "value");
String value = dataset.getAttribute("name");
String name;
name = dataset.name;
//or
name = dataset.getName();
…这对我来说非常有效。但现在我想使用一个模板引擎来动态生成HTML。在模板中,对我来说做很多
${dataset.getAttribute(“name”)}
并不理想。如果我能在向
数据集添加内容时创建人工方法,那就太好了。例如,如果我这样做

dataset.setAttribute("name", "value");
…我希望能像这样找回它

Dataset dataset = new Dataset();
dataset.setAttribute("name", "value");
String value = dataset.getAttribute("name");
String name;
name = dataset.name;
//or
name = dataset.getName();
…但到目前为止我还没能成功。我可以采取什么方法?这是否可行

编辑:


我知道Velocity提供了尝试将
dataset.name
解析为
dataset.get(“name”)
,这很好,但我需要知道在Velocity不是目标的情况下如何实现这一点。

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

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

请参见


如果您的方法名为
get(String属性)
而不是
getAttribute(String属性)
,您可以使用与常规属性相同的语法。因此,重构您的类,或者添加一个额外的
get
方法,该方法执行与
getAttribute
相同的操作,或者将您的对象转换为一个
Map
,该方法具有
get
方法。

从我所看到的情况来看,这对于模板引擎来说是相当常见的es for Java支持这两种

  • 格式为
    getAttribute
    的getter/setter,以及
  • Map接口的实现
在您花费太多时间寻找更通用的解决方案之前(假设上述解决方案不会像Velocity中那样得到支持),您可能需要先看看其他引擎是否有不支持的。如果所有可能的目标都支持,那么您可能可以很好地依赖它


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

我很欣赏Velocity的这一功能,但是其他不包括Velocity的情况又如何呢?然后看看其他答案,或者使用真正的、类型安全的、封装的、可重构的Java对象。有一件事让这个问题变得棘手,
Dataset
是一个有(可能)数百个实例的类,所有实例都具有完全不同且不相关的属性集。