From bfede3e5ee376a277d6386f69492ddeaa08120ac Mon Sep 17 00:00:00 2001 From: William Chern Date: Fri, 5 Jun 2026 12:47:34 -0700 Subject: [PATCH] Use thread context classloader to load Iceberg class in CometScanRule --- .../org/apache/comet/rules/CometScanRule.scala | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/spark/src/main/scala/org/apache/comet/rules/CometScanRule.scala b/spark/src/main/scala/org/apache/comet/rules/CometScanRule.scala index 6dfcdcff25..f2ed7920c2 100644 --- a/spark/src/main/scala/org/apache/comet/rules/CometScanRule.scala +++ b/spark/src/main/scala/org/apache/comet/rules/CometScanRule.scala @@ -744,12 +744,14 @@ object CometScanRule extends Logging { * one iteration for better performance with large tables. */ def validateIcebergFileScanTasks(tasks: java.util.List[_]): IcebergTaskValidationResult = { - // scalastyle:off classforname - val contentScanTaskClass = Class.forName(IcebergReflection.ClassNames.CONTENT_SCAN_TASK) - val contentFileClass = Class.forName(IcebergReflection.ClassNames.CONTENT_FILE) - val fileScanTaskClass = Class.forName(IcebergReflection.ClassNames.FILE_SCAN_TASK) - val unboundPredicateClass = Class.forName(IcebergReflection.ClassNames.UNBOUND_PREDICATE) - // scalastyle:on classforname + val contentScanTaskClass = + IcebergReflection.loadClass(IcebergReflection.ClassNames.CONTENT_SCAN_TASK) + val contentFileClass = + IcebergReflection.loadClass(IcebergReflection.ClassNames.CONTENT_FILE) + val fileScanTaskClass = + IcebergReflection.loadClass(IcebergReflection.ClassNames.FILE_SCAN_TASK) + val unboundPredicateClass = + IcebergReflection.loadClass(IcebergReflection.ClassNames.UNBOUND_PREDICATE) // Cache all method lookups outside the loop val fileMethod = contentScanTaskClass.getMethod("file")