首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PsiClass到java.lang.Class

PsiClass到java.lang.Class
EN

Stack Overflow用户
提问于 2021-02-11 13:41:12
回答 1查看 197关注 0票数 2

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

代码语言:javascript
复制
super.visitImportStatement(psiImport);
Class importedClass = Class.forName(psiImport.getQualifiedName(), true, psiImport.getClass().getClassLoader());

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-08 08:50:45

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

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

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

知道了这一点,您现在应该明白为什么不能将PsiClass“转换”为相应的Class

回到你最初的问题:

插件如何获得导入到被插件检查的项目中的库的名称和版本?

您不需要为此访问Class对象。相反,您可以使用IntelliJ SDK库。下面是一个例子:

代码语言:javascript
复制
Module mod = ModuleUtil.findModuleForFile(virtualFile,myProject);

ModuleRootManager.getInstance(mod).orderEntries().forEachLibrary(library -> {

  // do your thing here with `library`

  return true;
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66155896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档