2013-02-13 104 views
0

我正在为Java编写一个编译器,并且想要隐式地将所有源文件导入到java.lang包中(这是我所知道的大多数Java编译器所做的)。为了做到这一点,我需要以某种方式获得包中所有类的所有类的集合(即,Set<Class<?>>)或一组所有合格的名称(即,Set<String>)。获取java.lang包中所有类的集合(或集合)

我已经看过this page的反射API,但是我的项目结构(和其他因素)使它成为一个不太合适的人选。

所以我想知道是否有任何其他方式来获得这样的类(除了硬编码的东西,当然!)? java.lang是Java中最受欢迎的软件包,这一事实表明应该有某种方式。

+2

* “使之成为少 - 比 - 适用候选人” *为什么,特别是? – 2013-02-13 04:58:38

+0

请注意,您的编译器还需要隐式导入默认(无名称)软件包和源文件所在的软件包。 – 2013-02-13 05:00:45

+0

首先,要求编译器必须能够自行编译,并且我的编译器不能很好地处理泛型(更不用说反射和所有这些)。但是假设我们忽略了一段时间,实际上,当我将从站点下载的jar及其依赖项(Guava和slf4j)添加到构建文件时,该项目仍然无法正常运行,并且我一直收到'java .lang.NoClassDefFoundError:com.google.common.base.Predicates' – user1801813 2013-02-13 05:07:24

回答

0

尝试

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); 
     } 
    } 
+0

'ZipFile'在哪里? – user1801813 2013-02-13 05:40:19

+0

@ user1801813 [Here](http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipFile.html)。 – 2013-02-13 05:42:09

+0

这是java.util.zip包 – 2013-02-13 05:42:11