【问题标题】:How to get all imports defined in a class using java reflection?如何使用java反射获取类中定义的所有导入?
【发布时间】:2011-08-07 18:17:43
【问题描述】:

您好,我是 java 反射领域的新手。所以任何人都可以在这个问题场景中指导我。

我有一个名为 "SomClass.java",它导入一个名为 "SomPackage.RefClass" 的包 strong> 还有一些其他的 java 库,比如 java.lang.. 等。

现在我希望通过反射了解类中定义的所有导入。

import SomPackage.RefClass;
import java.lang.reflect.Field;
import java.io.IOException; 
 public class SomeClass{
  RefClass refClass_Obj;
  String nationality;
///some other members
}

我只想知道使用反射在类中定义的所有导入列表。

我看到一个Question 发布的消息与我的 Q 类似,但没有详细说明,因此需要一些好的帮助。

提前致谢。

【问题讨论】:

标签: java reflection dependencies


【解决方案1】:

导入是一个编译时特性 - 在任何地方都使用类型的全名的版本、使用 * 导入所有内容的版本和完全导入类的版本之间,编译后的代码没有区别名字。

如果你想在编译后的代码中找到所有使用的类型,那是另一回事。您可能希望将BCEL 视为分析字节码的一种方式。

【讨论】:

  • @zaree - 为了完整起见,无法使用反射 API 确定类型中使用的类型。
【解决方案2】:

我只想知道所有的列表 使用在类中定义的导入 反思

你不能因为编译器没有把它们放到目标文件中。它把它们扔掉了。导入只是编译器的简写。

【讨论】:

  • 正如你所解释的“你不能因为编译器没有将它们放入目标文件中。”我已经尝试过了,当我使用一些 Java 反编译器(如 DJ Java Decompiler)反编译一个 Java 文件时。它会显示所有导入(Java 库和包)。你能解释一下吗?
  • @zaree 不,不会的。它将为该类使用的其他包中的所有类合成导入语句。它不是重新创建原始源代码。
【解决方案3】:

我认为您可以使用Qdox 来获取一个实际上不是通过反射的类中的所有导入,但它可以达到您的目的:

    String fileFullPath = "Your\\java\\ file \\full\\path";
    JavaDocBuilder builder = new JavaDocBuilder();
    builder.addSource(new FileReader( fileFullPath  ));

    JavaSource src = builder.getSources()[0];
    String[] imports = src.getImports();

    for ( String imp : imports )
    {
        System.out.println(imp);
    }

【讨论】:

  • 不,你不能。来自您自己的链接:“QDox 是一种高速、占用空间小的解析器,用于从 文件中提取类/接口/方法定义......”[强调添加]
  • 是的,你是对的,通过反思这是不可能的。但是使用 Qdox 可以从 .java 文件中获取,这可能对其他人有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 2012-01-21
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多