Package org.hotswap.agent.util
Class PluginManagerInvoker
- java.lang.Object
-
- org.hotswap.agent.util.PluginManagerInvoker
-
public class PluginManagerInvoker extends Object
Invoke methods on plugin manager, avoid classloader conflicts. Each method has two variants - direct call or method source code builder. Note that because methods are invoked accross classloader, only parameters known to both classloaders can be used. This is generally true for basic and java.* types.- Author:
- Jiri Bubnik
-
-
Constructor Summary
Constructors Constructor Description PluginManagerInvoker()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static StringbuildCallCloseClassLoader(String classLoaderVar)static StringbuildCallPluginMethod(Class pluginClass, String method, String... paramValueAndType)Equivalent to callPluginMethod for insertion into source code.static StringbuildCallPluginMethod(String appClassLoaderVar, Class pluginClass, String method, String... paramValueAndType)Same asbuildCallPluginMethod(Class, String, String...), but with explicit appClassLoader variable.static StringbuildInitializePlugin(Class pluginClass)static StringbuildInitializePlugin(Class pluginClass, String classLoaderVar)static voidcallCloseClassLoader(ClassLoader appClassLoader)Free all classloader references and close any associated plugin instance.static <T> TcallInitializePlugin(Class<T> pluginClass, ClassLoader appClassLoader)Initialize plugin for a classloader.static ObjectcallPluginMethod(Class pluginClass, ClassLoader appClassLoader, String method, Class[] paramTypes, Object[] params)Methods on plugin should be called via reflection, because the real plugin object is in parent classloader, but plugin class may be defined in app classloader as well introducing ClassCastException on same class name.
-
-
-
Method Detail
-
callInitializePlugin
public static <T> T callInitializePlugin(Class<T> pluginClass, ClassLoader appClassLoader)
Initialize plugin for a classloader.- Parameters:
pluginClass- identify plugin instanceappClassLoader- classloader in which the plugin should reside
-
buildInitializePlugin
public static String buildInitializePlugin(Class pluginClass, String classLoaderVar)
-
callCloseClassLoader
public static void callCloseClassLoader(ClassLoader appClassLoader)
Free all classloader references and close any associated plugin instance. Typical use is after webapp undeploy.- Parameters:
appClassLoader- clasloade to free
-
callPluginMethod
public static Object callPluginMethod(Class pluginClass, ClassLoader appClassLoader, String method, Class[] paramTypes, Object[] params)
Methods on plugin should be called via reflection, because the real plugin object is in parent classloader, but plugin class may be defined in app classloader as well introducing ClassCastException on same class name.- Parameters:
pluginClass- class name of the plugin - it is used to resolve plugin instance from plugin managerappClassLoader- application classloader (to resolve plugin instance)method- method nameparamTypes- param types (as required by reflection)params- actual param values- Returns:
- method return value
-
buildCallPluginMethod
public static String buildCallPluginMethod(Class pluginClass, String method, String... paramValueAndType)
Equivalent to callPluginMethod for insertion into source code. PluginManagerInvoker.buildCallPluginMethod(this, "hibernateInitialized", "getClass().getClassLoader()", "java.lang.ClassLoader")- Parameters:
pluginClass- plugin to usemethod- method nameparamValueAndType- for each param its value AND type must be provided- Returns:
- method source code
-
buildCallPluginMethod
public static String buildCallPluginMethod(String appClassLoaderVar, Class pluginClass, String method, String... paramValueAndType)
Same asbuildCallPluginMethod(Class, String, String...), but with explicit appClassLoader variable. Use this method if appClassLoader is different from getClass().getClassLoader().
-
-