2

我正在为 IntelliJ IDEA 开发插件。插件如何获取导入到插件正在检查的项目中的库的名称和版本?我有项目的 PsiClass,但无法将其转换为 java.lang.Class。也许有办法从 PsiElement 获取 ClassLoader?

super.visitImportStatement(psiImport);
Class importedClass = Class.forName(psiImport.getQualifiedName(), true, psiImport.getClass().getClassLoader());

PsiImport.getClass().GetClassLoader()- 返回类 PsiImportStatementImpl 的 ClassLoader 而不是我导入的类的 ClassLoader。

4

1 回答 1

1

IntelliJ 主要对您的代码进行静态分析。事实上,IDE 和您运行/调试的项目具有完全不同的类路径。打开项目时,您的依赖项不会添加到 IDE 类路径中。相反,IDE 将对 JAR 进行索引,这意味着它将自动发现所有声明(类、方法、接口等)并将它们保存在缓存中以供以后使用。

当您在编辑器中编写代码时,静态分析工具将利用此索引的内容来验证您的代码并在您尝试使用未知定义时显示错误。

另一方面,当您从项目中运行 Main 类时,它将产生一个java具有自己的类路径的新进程。这个类路径可能包含在你的模块中声明的每个依赖项。

知道了这一点,您现在应该明白为什么不能将 a “转换”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;
});
于 2021-03-08T08:50:45.113 回答