【问题标题】:Get a Set (or Collection) of all classes in java.lang package获取 java.lang 包中所有类的集合(或集合)
【发布时间】:2013-02-13 04:54:36
【问题描述】:

我正在为 Java 编写一个编译器,并希望将 java.lang 包隐式导入所有源文件(这是我所知道的大多数 Java 编译器所做的)。

为此,我需要以某种方式获取包中所有类的一组所有类(即Set<Class<?>>)或一组所有限定名称(即Set<String>)。

我查看了来自 this page 的反射 API,但我的项目结构(和其他因素)使其不太适合。

所以我想知道是否有任何其他方法可以获取这些类(当然,除了硬编码之外!)? java.lang 是 Java 中最流行的包这一事实表明应该有一些方法。

【问题讨论】:

  • “使它成为一个不太合适的候选人” 为什么,具体来说?
  • 请注意,您的编译器还需要隐式导入默认(无名称)包和源文件所在的包。
  • 好吧,首先,要求是编译器必须能够自己编译,而我的编译器不能很好地处理泛型(更不用说反射和所有这些了)。但是假设我们暂时忽略了这一点,实际上,当我将从站点下载的 jar 及其依赖项(Guava 和 slf4j)添加到构建文件中时,项目仍然无法正常运行,并且我不断收到 @987654326 @
  • @AndrewThompson(见上文,对不起,我忘了标记)
  • @PaulBellora 那部分已经得到妥善处理。我这里需要的是添加一点'功能',即隐式导入java.lang.*

标签: java compiler-construction compilation java.lang.class


【解决方案1】:

试试

    String path = Object.class.getResource("Object.class").getPath().replace("!/java/lang/Object.class", "");
    ZipFile z = new ZipFile(new File(new URI(path)));
    Enumeration<? extends ZipEntry> e =z.entries();
    Set<String> s = new HashSet<String>();
    while(e.hasMoreElements()) {
        String n = e.nextElement().getName();
        if (n.matches("java/lang/\\w+\\.class")) {
            s.add(n);
        }
    }

【讨论】:

  • @user1801813 Here.
  • 是java.util.zip包
  • 嗯,我不确定是不是只是我的机器配置不好,但是rt.jar无法打开。而且我不倾向于认为将文件与编译器一起打包是明智的做法?
  • 这是我在java.home\lib 中的所有内容:` ct.sym dt.jar ir.idl jconsole.jar orb.idl sa-jdi.jar tools.jar `
  • 如果你在 mac 那么它是 classes.jar 并且路径可能会像 ("java.home") + "/../Classes/classes.jar
猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 2016-01-19
  • 2018-04-03
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多