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
是一个有(可能)数百个实例的类,所有实例都具有完全不同且不相关的属性集。