LuciferYang opened a new issue, #7688:
URL: https://github.com/apache/kyuubi/issues/7688

   ### Description
   
   `DynMethods.Builder` lets a caller choose the loader used for name-based 
lookups:
   
   ```java
   public Builder loader(ClassLoader newLoader) {
     this.loader = newLoader;
     return this;
   }
   ```
   
   `impl(String className, ...)` honours it:
   
   ```java
   Class<?> targetClass = Class.forName(className, true, loader);
   ```
   
   `ctorImpl(String className, ...)` does not. It builds a fresh inner 
`DynConstructors.Builder`, whose own `loader` field defaults to 
`Thread.currentThread().getContextClassLoader()`, and never forwards the one 
configured on the outer builder:
   
   ```java
   this.method = new DynConstructors.Builder().impl(className, 
argClasses).buildChecked();
   ```
   
   So `.loader(x).ctorImpl("some.Class")` resolves `some.Class` through the 
thread context loader rather than through `x`. When the context loader cannot 
see the class, `DynConstructors.Builder.impl(String, ...)` swallows the 
`ClassNotFoundException` as a candidate miss, and the outer `build()` / 
`buildChecked()` then fails with a generic cannot-find error. The configured 
loader is ignored without any diagnostic saying so.
   
   This matters in Kyuubi because engine code reflects into classes that are 
only visible to a particular loader (a Spark or Flink user classloader, an 
isolated engine classloader), and `.loader(...)` is the documented way to name 
that loader.
   
   Reproducer:
   
   ```java
   ClassLoader appLoader = MyClass.class.getClassLoader();
   ClassLoader blinded = new URLClassLoader(new URL[0], null);
   Thread.currentThread().setContextClassLoader(blinded);
   
   DynMethods.builder("MyClass")
       .loader(appLoader)                  // ignored
       .ctorImpl(MyClass.class.getName())
       .buildChecked();
   
   // java.lang.NoSuchMethodException: Cannot find method: MyClass
   ```
   
   Expected: the constructor is found, because `appLoader` can see `MyClass`.
   
   ### Affected code
   
   `DynMethods.Builder.ctorImpl(String, Class...)`. The `ctorImpl(Class, 
Class...)` overload takes an already-loaded class and its inner lookup only 
calls `Class.getConstructor`, so it never reads a loader and is unaffected.
   
   ### Upstream
   
   Neither upstream copy forwards the loader either: parquet-common has the 
same shape on 1.12.x and on current master, and iceberg-common had it on 0.12.1 
before removing `ctorImpl` altogether. Note that `ctorImpl` currently has no 
callers inside Kyuubi, so an alternative to fixing it is to follow iceberg and 
drop both overloads; that is a maintainer call.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to