Class SingleClassloaderExecutor

  • All Implemented Interfaces:
    ClassloaderExecutor

    public class SingleClassloaderExecutor
    extends AbstractClassloaderExecutor
    A ClassLoaderExecutor can run any code in any classloader. E.g. assume you have a classloader called myClassloader and you want to execute a (void) method called myMethod in myObject using this CL:
         SingleClassloaderExecutor cle = new SingleClassloaderExecutor(myClassloader);
         cle.execute(new Runnable() {
              public void run() {
                 myObject.myMethod();
              }
         });
     
    What happens is that the entire object graph of myObject is deep-cloned into the myClassloader classloader and then the myObject.myMethod() is executed.

    You can also execute methods that return something:

         SingleClassloaderExecutor cle = new SingleClassloaderExecutor(myClassloader);
         MyResult result = cle.execute(new Callable() {
              public MyResult call() throws Exception {
                 return myObject.myMethod();
              }
         });
     
    Here we imagine that myObject.myMethod() returns an object of type MyResult. Again the entire state will be deep-cloned to myClassloader and then the myObject.myMethod() is executed. The result of the method call is deep-cloned back into the original classloader (the one that made the call to cle.execute(..)) and is ready for use.

    Note that the SingleClassloaderExecutor requires a deep cloner implementing the DeepClonerSPI present in the class-path.

    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.lang.ClassLoader classloader  
    • Field Detail

      • classloader

        private final java.lang.ClassLoader classloader
    • Constructor Detail

      • SingleClassloaderExecutor

        public SingleClassloaderExecutor​(java.lang.ClassLoader classloader)
    • Method Detail

      • execute

        protected java.lang.Object execute​(java.lang.Object instance,
                                           java.lang.reflect.Method method,
                                           java.lang.Object... arguments)
        Specified by:
        execute in class AbstractClassloaderExecutor