目标从路径字符串中解析Java对象树中的字段的最有效方法是什么?
甲模板引擎,采用一个含有多个置换位点和上下文树的文档。替换站点的格式为$ {someObject.someProperty},并使用类似于JavaScript的属性访问器的点分隔路径表示法标识目标字段。上下文树的POJO这样一个简单的层次结构:
public class ContextRoot {
public SomeObject someObject;
public OtherObject otherObject;
}
public class SomeObject {
public String someProperty;
}
public class OtherObject {
public Integer count;
}
像上下文根的类的实例与模板文件送入模板引擎一起和产品是一个文档,其中所有的替换字符串中有已被他们解决的财产的价值取代。
我已经试过
目前,我们的解决方案使用JSON杰克逊向ObjectMapper我们的上下文根对象转换成地图。从这一点,我们使用jayway/JsonPath库来解析由路径引用的属性的值。这是合作得非常好,但我已经开始担心,这种方法的性能可能不是最优的,因为杰克逊可能会或可能不会在上下文对象反序列化回成地图前转换为中间JSON表示。
问题
我也接触过一些解决方案建议使用本地Java反射来实现类似的目标。我对这种方法的担忧是,我被告知从性能的角度来看反射可能是昂贵的。此外,使用这种方法滚动内部解决方案意味着我们会牺牲杰克逊的巧妙类型推导和序列化逻辑;我们不喜欢重新实现的东西。有没有其他的方法可以建议完成这样的事情?
更多信息
澄清一点,而我从来没有一个鸡蛋里挑骨头的作品,并且效果很好,这个模板引擎,同时服务于客户端web请求所以我们运行的解决方案的性能试图对我们的响应时间的位置敏感一点。
是否有一个原因,你没有使用开源模板引擎,这会为你做这个? – meriton
除了通常的企业政治压力以及这台发动机的基础对我们来说运转良好的事实之外,没有任何好的*理由。这是一项我们所负责的新增功能,我们正在从中获得完美的可接受性能,但我认为它可能会好得多。 – DaveStance
您如何看待*“杰克逊的巧妙类型演绎和序列化逻辑”*的作品?使用反射。所以你已经开始认识到思考反射性能的重要性,但是Jackson做得更多,甚至比直接使用反射还要慢。慢速部分实际上不是反射,而是解析'$ {someObject.someProperty}'表达式,以及将数据转换为JSON所需的数据转换。 – Andreas