如何解决可以使用Java评估YAML值字符串吗?
是否可以将Java代码作为值传递到YAML文件中。例如,如下所示:
---
dueDate: "DueDateCalc()"
DueDateCalc()可能是在解析YAML的Java代码中定义的方法。然后,它将Java DueDate属性设置为预定义的DueDateCalc()方法的返回。
解决方法
在Java运行时反射的限制内这是可能的,但是您需要自己实现。
例如,您的YAML可能如下所示:
---
dueDate: !call DueDateCalc
!call
是一个本地标记,用于告诉加载代码标量值DueDateCalc
应该解释为要调用的方法(由您选择,而不是预定义的方法)。您可以使用!calc
标签的自定义构造函数来实现此功能,该标签在某个给定的类中搜索具有给定名称的方法,然后在某个给定的对象上调用它。
参数呢?好吧,仍然有可能,但是很快就会变得丑陋。第一个问题是如何定义参数:
with nested YAML sequences: !call [MyMethod,[1,2,3]]
with a scalar that needs to be parsed: !call MyMethod(1,3)
前一个选项让YAML解析参数,您将获得一个列表;后一种方法要求您解析从YAML获得的字符串中调用的方法。
第二个问题是将值加载到Java变量中,以便可以将其作为参数列表。 Java反射使您可以获取方法的参数类型,并可以使用这些参数类型来加载参数值。例如,如果第一个参数的类型为String,则可以将1
解析为"1"
,而如果它是int,则可以将1
解析为int。如果您使用嵌套的YAML序列进行方法调用编码,则可以使用SnakeYAML的内置功能来实现。
即使参数是具有复杂结构的类对象,这甚至也可以使用,您只需使用常规的YAML语法即可正确加载这些对象。不可能直接在代码中引用变量,但是可以定义另一个标签!lookup
,该标签从给定的Map
结构中检索值。
尽管反射使您可以进行方法调用,但是您无法直接求值6*9
之类的表达式。因此,在尝试实现任何功能之前,请评估所需的功能,并通过反射检查其是否可行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。