可變引數呼叫

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)