Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取模块java.base中所有类的类对象_Java_Class_Module - Fatal编程技术网

获取模块java.base中所有类的类对象

获取模块java.base中所有类的类对象,java,class,module,Java,Class,Module,如何以编程方式获取模块java.base中所有类的Class对象?我愿意使用任何外部库。我已经查看了库,但无法获得内置Java库中的类列表,只有类路径上的类。我试图通过迭代文件系统中的所有文件来手动执行此操作,但(据我所知)我无法访问这些类,因为它们位于jar文件中。获取java.base中类的所有Class对象时,代码是什么样子的 谢谢。我能够从src.zip文件中提取所有类: public class TypeUtils { private static Set<Class&l

如何以编程方式获取模块
java.base
中所有类的
Class
对象?我愿意使用任何外部库。我已经查看了库,但无法获得内置Java库中的类列表,只有类路径上的类。我试图通过迭代文件系统中的所有文件来手动执行此操作,但(据我所知)我无法访问这些类,因为它们位于jar文件中。获取
java.base
中类的所有
Class
对象时,代码是什么样子的


谢谢。

我能够从src.zip文件中提取所有类:

public class TypeUtils {
    private static Set<Class<?>> classes;
    private static final Set<String> CONSIDERED_MODULES = Set.of("java.base");
    public static void main(String[] args) {
        try {
            findClasses();
            classes.forEach(System.out::println);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void findClasses() throws IOException {
        classes = new HashSet<>();
        File root = new File(System.getProperty("java.home"));
        File lib = new File(root, "lib");
        ZipFile srczip = new ZipFile(new File(lib, "src.zip"));
        Iterator<? extends ZipEntry> itr = srczip.entries().asIterator();
        while(itr.hasNext())
            extractFromEntry(itr.next());
    }
    
    private static void extractFromEntry(ZipEntry entry) {
        String name = entry.getName();
        if(name.endsWith(".java")) {
            int firstSlash = name.indexOf('/');
            String moduleName = name.substring(0, firstSlash);
            if(!CONSIDERED_MODULES.contains(moduleName)) return;
            String fullyQualifiedName = name.substring(firstSlash + 1, name.length() - 5).replace('/', '.');
            if(fullyQualifiedName.endsWith("-info")) return; //catches module-info or package-info files
            try {
                Class<?> clazz = Class.forName(fullyQualifiedName);
                classes.add(clazz);
            }
            catch (ClassNotFoundException e) {}
        }
    }
}
公共类TypeUtils{
私有静态集clazz=Class.forName(fullyQualifiedName);
添加(clazz);
}
catch(classnotfound异常){}
}
}
}
可能是这样的: