YAML值字符串可以在Java中计算吗?
是否可以将Java代码作为值传递到YAML文件中。例如,类似这样的内容:YAML值字符串可以在Java中计算吗?,java,yaml,snakeyaml,Java,Yaml,Snakeyaml,是否可以将Java代码作为值传递到YAML文件中。例如,类似这样的内容: --- dueDate: "DueDateCalc()" DueDateCalc()可能是解析YAML的Java代码中定义的方法。然后,它将Java dueDate属性设置为预定义DueDateCalc()方法的返回。这在Java运行时反射的约束范围内是可能的,但是您需要自己实现它 例如,您的YAML可以如下所示: --- dueDate: "DueDateCalc()"
---
dueDate: "DueDateCalc()"
DueDateCalc()可能是解析YAML的Java代码中定义的方法。然后,它将Java dueDate属性设置为预定义DueDateCalc()方法的返回。这在Java运行时反射的约束范围内是可能的,但是您需要自己实现它 例如,您的YAML可以如下所示:
---
dueDate: "DueDateCalc()"
--
决战日期:!调用DueDateCalc
!call
是一个本地标记,用于告诉加载代码标量值DueDateCalc
应解释为要调用的方法(这是由您选择的,而不是预定义的)。您可以使用的自定义构造函数来实现这一点!calc
标记,用于在某个给定类中搜索具有给定名称的方法,然后在某个给定对象上调用该方法
参数呢?嗯,还是有可能的,但很快就会变丑。第一个问题是如何定义参数:
带有嵌套YAML序列的:!调用[MyMethod[1,2,3]]
使用需要分析的标量:!调用MyMethod(1、2、3)
前一个选项允许YAML解析参数,您将得到一个列表;后一个选项要求您根据从YAML获得的字符串自己解析方法调用
第二个问题是将值加载到Java变量中,以便可以将它们作为参数列表提供。Java反射允许您获取方法的参数类型,并可以使用这些类型加载参数值。例如,如果第一个参数的类型是字符串,则将1
解析为“1”
,而如果它是int,则可以将1
解析为int。如果使用嵌套YAML序列进行方法调用编码,则可以使用SnakeYAML的内置功能实现这一点
如果参数是具有复杂结构的类对象,这甚至可以工作,您只需使用正常的YAML语法,对象将被正确加载。不能直接引用代码中的变量,但可以定义另一个标记!查找
,从给定的映射
结构中检索值
虽然反射允许进行方法调用,但不能直接计算像
6*9
这样的表达式。因此,在您尝试实现任何功能之前,请评估您需要的功能,并检查它是否可以通过反射实现。这在Java运行时反射的约束范围内是可能的,但是您需要自己实现它
例如,您的YAML可以如下所示:
---
dueDate: "DueDateCalc()"
--
决战日期:!调用DueDateCalc
!call
是一个本地标记,用于告诉加载代码标量值DueDateCalc
应解释为要调用的方法(这是由您选择的,而不是预定义的)。您可以使用的自定义构造函数来实现这一点!calc
标记,用于在某个给定类中搜索具有给定名称的方法,然后在某个给定对象上调用该方法
参数呢?嗯,还是有可能的,但很快就会变丑。第一个问题是如何定义参数:
带有嵌套YAML序列的:!调用[MyMethod[1,2,3]]
使用需要分析的标量:!调用MyMethod(1、2、3)
前一个选项允许YAML解析参数,您将得到一个列表;后一个选项要求您根据从YAML获得的字符串自己解析方法调用
第二个问题是将值加载到Java变量中,以便可以将它们作为参数列表提供。Java反射允许您获取方法的参数类型,并可以使用这些类型加载参数值。例如,如果第一个参数的类型是字符串,则将1
解析为“1”
,而如果它是int,则可以将1
解析为int。如果使用嵌套YAML序列进行方法调用编码,则可以使用SnakeYAML的内置功能实现这一点
如果参数是具有复杂结构的类对象,这甚至可以工作,您只需使用正常的YAML语法,对象将被正确加载。不能直接引用代码中的变量,但可以定义另一个标记!查找
,从给定的映射
结构中检索值
虽然反射允许进行方法调用,但不能直接计算像6*9
这样的表达式。所以,在您尝试和实现任何东西之前,请评估您需要的功能,并通过反射检查它是否可行