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

wqlqzqxt  于 2023-01-11  发布在  Java
关注(0)|答案(5)|浏览(143)

你好,我是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
}

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

  • 我看到一个Question张贴听到类似于我的Q,但它不是很好地阐述,所以,需要一些很好的方向的帮助.*

先谢谢你了。

cgyqldqp

cgyqldqp1#

正如@Asraful Haque所建议的,qdox有助于读取java文件的导入
使用Maven依赖项

<dependency>
            <groupId>com.thoughtworks.qdox</groupId>
            <artifactId>qdox</artifactId>
            <version>2.0.1</version>
        </dependency>

请参考代码的修改版本

package readimports;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Collection;
import java.util.List;

import com.thoughtworks.qdox.JavaProjectBuilder;
import com.thoughtworks.qdox.model.JavaSource;

public class TestReadAllImport {

    public static void main(String[] args) throws FileNotFoundException {
        String fileFullPath = "path to java file";
        JavaProjectBuilder builder = new JavaProjectBuilder();
        builder.addSource(new FileReader( fileFullPath  ));

        Collection<JavaSource> srcs = builder.getSources();
        for(JavaSource src : srcs) {
            List<String> imports = src.getImports();

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

}
qojgxg4l

qojgxg4l2#

感谢您分享qdox,我使用它递归地查找所有导入,并查找唯一的包和唯一的导入。

<!-- https://mvnrepository.com/artifact/com.thoughtworks.qdox/qdox -->
<dependency>
    <groupId>com.thoughtworks.qdox</groupId>
    <artifactId>qdox</artifactId>
    <version>2.0.3</version>
</dependency>

使用简单递归获取给定类的所有包和导入。

package test;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import com.thoughtworks.qdox.JavaProjectBuilder;
import com.thoughtworks.qdox.model.JavaSource;

public class ImportsIdentifier {

    private static String sysPath ="//<Absolute Path>/src/main/java/";
    private static String fileType = ".java";
    private static Set<String> importFiles = new HashSet<>();
    private static Set<String> packages = new HashSet<>();
    
    public static void main(String[] args) throws FileNotFoundException {
        String path = sysPath + "<java file path>";
        
        printImports(path);
        
        System.out.println(importFiles);
        System.out.println(packages);
    }
    
    private static void printImports(String path) throws FileNotFoundException {
        JavaProjectBuilder jp = new JavaProjectBuilder();
        jp.addSource(new FileReader(path));

        Collection<JavaSource> srcs = jp.getSources();

        for (JavaSource src : srcs) {
            System.out.println(src.getPackage());
            packages.add(src.getPackage().toString());
            
            for(String imprt: src.getImports()) {
                if(imprt.startsWith("<filter for any package>")) {
                    
                    imprt = sysPath+imprt.replaceAll("\\.", "/")+fileType;
                    if(importFiles.contains(imprt)) {
                        continue;
                    }
                    importFiles.add(imprt);
                    System.out.println(imprt);
                    
                    printImports(imprt);
                }
            }
        }
    }

}
dly7yett

dly7yett3#

我只想知道类中使用反射定义的所有导入的列表
你不能这样做,因为编译器不会把它们放进目标文件,而是把它们丢弃了。Import只是编译器的一个缩写。

js81xvg6

js81xvg64#

导入是一个编译时的特性--无论是在哪里提到类型都使用类型的全名的版本,还是使用 * 导入所有内容的版本,以及使用全名导入类的版本,对编译后的代码没有任何区别。
如果你想在编译后的代码中找到所有使用过的类型,那就有点不同了,你可能想看看BCEL作为分析字节码的一种方法。

vaj7vani

vaj7vani5#

我认为可以使用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);
    }

相关问题