可变参数调用

Spring Expression Language 支持对构造函数方法和用户定义函数进行可变参数调用。

以下示例展示了如何在表达式中通过提供可变参数列表作为独立参数('blue', 1)来调用 java.lang.String#formatted(Object…​) *可变参数* 方法。

  • Java

  • Kotlin

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted('blue', 1)";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted('blue', 1)"
val message = parser.parseExpression(expression).getValue(String::class.java)

可变参数列表也可以作为数组提供,如下例所示(new Object[] {'blue', 1})。

  • Java

  • Kotlin

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted(new Object[] {'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted(new Object[] {'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)

另一种方法是,可变参数列表可以作为 java.util.List 提供——例如,作为内联列表{'blue', 1})。以下示例展示了如何实现这一点。

  • Java

  • Kotlin

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted({'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted({'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)

可变参数类型转换

与 Java 中对可变参数调用的标准支持不同,在 SpEL 中调用可变参数构造函数、方法或函数时,类型转换可能会应用于单个参数。

例如,如果我们在 EvaluationContext 中注册了一个名为 #reverseStrings 的自定义函数,对应签名 String reverseStrings(String…​ strings) 的方法,我们可以在 SpEL 表达式中用任何可以转换为 String 的参数调用该函数,如下例所示。

  • Java

  • Kotlin

// evaluates to "3.0, 2.0, 1, SpEL"
String expression = "#reverseStrings('SpEL', 1, 10F / 5, 3.0000)";
String message = parser.parseExpression(expression)
		.getValue(evaluationContext, String.class);
// evaluates to "3.0, 2.0, 1, SpEL"
val expression = "#reverseStrings('SpEL', 1, 10F / 5, 3.0000)"
val message = parser.parseExpression(expression)
		.getValue(evaluationContext, String::class.java)

类似地,任何其组件类型是所需可变参数类型子类型的数组都可以作为可变参数调用的变量参数列表提供。例如,String[] 数组可以提供给接受 Object…​ 参数列表的可变参数调用。

以下列表演示了我们可以向 java.lang.String#formatted(Object…​) *可变参数* 方法提供 String[] 数组。它还强调了 1 将被自动转换为 "1"

  • Java

  • Kotlin

// evaluates to "blue is color #1"
String expression = "'%s is color #%s'.formatted(new String[] {'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%s'.formatted(new String[] {'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)