我正在为IntelliJ IDEA开发插件。插件如何获得导入到被插件检查的项目中的库的名称和版本?我有项目的PsiClass,但不能将其转换为java.lang.Class。也许有办法让ClassLoader从PsiElement那里得到?
super.visitImportStatement(psiImport);
Class importedClass = Class.forName(psiImport.getQualifiedName(), true, psiImport.getClass().getClassLoader());PsiImport.getClass().GetClassLoader() -返回类PsiImportStatementImpl的ClassLoader,而不是我导入的类的ClassLoader。
发布于 2021-03-08 08:50:45
IntelliJ主要对代码进行静态分析。实际上,IDE和您运行/调试的项目有完全不同的类路径。打开项目时,依赖项不会添加到IDE类路径中。相反,IDE将索引JAR,这意味着它将自动发现所有声明(类、方法、接口等),并将它们保存到缓存中。
在编辑器中编写代码时,静态分析工具将利用此索引的内容来验证代码,并在尝试使用未知定义时显示错误。
另一方面,当您从项目中运行一个主类时,它将生成一个新的java进程,该进程具有自己的类路径。这个类路径可能包含模块中声明的每个依赖项。
知道了这一点,您现在应该明白为什么不能将PsiClass“转换”为相应的Class。
回到你最初的问题:
插件如何获得导入到被插件检查的项目中的库的名称和版本?
您不需要为此访问Class对象。相反,您可以使用IntelliJ SDK库。下面是一个例子:
Module mod = ModuleUtil.findModuleForFile(virtualFile,myProject);
ModuleRootManager.getInstance(mod).orderEntries().forEachLibrary(library -> {
// do your thing here with `library`
return true;
});https://stackoverflow.com/questions/66155896
复制相似问题