YAML值字符串可以在Java中计算吗?

YAML值字符串可以在Java中计算吗?,java,yaml,snakeyaml,Java,Yaml,Snakeyaml,是否可以将Java代码作为值传递到YAML文件中。例如,类似这样的内容: --- dueDate: "DueDateCalc()" DueDateCalc()可能是解析YAML的Java代码中定义的方法。然后,它将Java dueDate属性设置为预定义DueDateCalc()方法的返回。这在Java运行时反射的约束范围内是可能的,但是您需要自己实现它 例如,您的YAML可以如下所示: --- dueDate: "DueDateCalc()"

是否可以将Java代码作为值传递到YAML文件中。例如,类似这样的内容:

--- 
 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
这样的表达式。所以,在您尝试和实现任何东西之前,请评估您需要的功能,并通过反射检查它是否可行