How to Load class object from source project ? How to use 'UrlClassLoader'?

Answered

Hi, 

I'm trying to invoke an API and this API invokes ‘Class.forname()’,then I got a 'ClassNotFoundException' .

Here is a similar post,but it doesn't work for me:

https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000615544-Intellij-Plugin-Load-class-object-from-source-project

My code:

List<URL> urls = new ArrayList<>();
pluginModule.getAllIdeaModules().values().forEach(
module -> {
try {
urls.add(VfsUtilCore.virtualToIoFile(CompilerModuleExtension.getInstance(module).getCompilerOutputPath()).toURI().toURL());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
);
ClassLoader original = Thread.currentThread().getContextClassLoader();
UrlClassLoader cl=UrlClassLoader.build().parent(original).useCache().urls(urls).allowBootstrapResources().get();
ClassLoaderUtil.runWithClassLoader(cl,()-> invokeApi()); //get ClassNotFoundException
ClassLoaderUtil.runWithClassLoader(cl,()->Class.forName("myProject.class.fqcn"));//get ClassNotFoundException

 

Is there anything wrong with my code?Or are there other ways to achieve to load class object from source code into plugin? 

1 comment
Comment actions Permalink

What do you want to achieve with your plugin? Why do you set custom classloader parent's classloader to plugin's classloader?

Note contents of compiler output directories may be missing, incomplete or changing exactly at the moment when this code is executed.

0

Please sign in to leave a comment.