如何使用java反射在类中定义所有导入?

zar*_*ree 10 java reflection dependencies

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

我有一个名为"SomClass.java",它导入一个名为"SomPackage.RefClass" 的包 以及一些其他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
}
Run Code Online (Sandbox Code Playgroud)

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

我看到发布的一个问题类似于我的问题,但是没有详细说明,需要一些好的帮助方向.

提前致谢.

use*_*421 13

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

你不能因为编译器没有将它们放入目标文件中.它把它们抛弃了.导入只是编译器的简写.

  • @zaree 不,不会。它将综合该类使用的其他包中的所有类的导入语句。它不是重新创建原始源代码。 (2认同)

Jon*_*eet 12

导入是一个编译时功能 - 在使用所提到的类型的全名的版本,使用*导入所有内容的版本和使用全名导入类的版本之间的编译代码没有区别.

如果要查找已编译代码中使用的所有类型,这是一个稍微不同的问题.您可能希望将BCEL视为分析字节码的一种方式.


Asr*_*que 5

我认为您可以使用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);
    }
Run Code Online (Sandbox Code Playgroud)

  • 是的,你是对的,通过反思这是不可能的。但是使用 Qdox 可以从 .java 文件中获取,这可能对其他人有用。 (5认同)
  • 不,你不能。来自您自己的链接:“QDox 是一种高速、占用空间小的解析器,用于从 *source* 文件中提取类/接口/方法定义......”[强调已添加] (2认同)