使用单个类加载器通过反射加载类

时间:2016-12-02 16:46:52

标签: java maven tomcat reflection classloader

我有一个webapp项目,我正在通过tomcat运行。 webapp项目具有核心项目的依赖性。 (核心项目jar存在于WEB-INF / lib文件夹中)。

我有另一个具有相同核心项目依赖性的示例项目。我需要加载一个类并通过反射调用示例项目jar中的特定方法。

我需要通过公共类加载器加载示例项目中使用的核心项目类以及Web应用程序项目。

问题是: - 我无法在公共类加载器中加载核心项目类和示例项目类。

我过去两天尝试了很多,比如使用自定义类加载器和系统类加载器加载类,但我总是得到NoSuchMethodExceptionClassCastExceptionClassNotFoundException

我应该如何处理这种拥有通用类加载器的情况?

  

我需要加载和调用方法的类(Sample Project)

public class ObjectiveFunction implements ScriptInterface{//ScriptInterface is a interface present in core project

@Override
public void execute(Map<Integer, CustomObject> map, IModel inputModel, List<AbstractNode> nodes) {
    for (Node node : nodes){// this line throws ClassCastException
 // IModel is an interface in core project
// AbstractNode (abstract class), CustomObject and Node are present in core project. Different nodes extends AbstractNode
    // Some logic
}
  

由webapp调用的核心项目中的类加载代码   项目

URLClassLoader classLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(classLoader, url);

Class<?> classToLoad = classLoader.loadClass(className);
Method executeMethod = classToLoad.getDeclaredMethod("execute", Map.class, IModel.class, List.class);

Object instance = classToLoad.newInstance();
executeMethod .invoke(instance, value1, value2, value3); // This line throws NoSuchMethodException

0 个答案:

没有答案