2016-12-07 35 views
0

我試圖使用Java TreePathScanner API來確定將從給定編譯生成的類文件的列表。例如,下面的代碼:Java TreePathScanner不會爲沒有正文的新類聲明調用visitClass

public class InnerClass { 
    private final InnerInnerClass clazz = new InnerInnerClass(); 

    private class InnerInnerClass { 
    } 
} 

會生成以下文件:

  • InnerClass.class
  • $將InnerClass 1.class
  • $將InnerClass InnerInnerClass.class

但是,在我的TreePathScanner子類中,visitClass僅被調用兩次,用於InnerClass類,而I nnerInnerClass類,但不是從新類聲明創建的匿名命名類。更改源到以下按預期工作:

public class InnerClass { 
    private final InnerInnerClass clazz = new InnerInnerClass() { }; 

    private class InnerInnerClass { 
    } 
} 

我的工具的完整的源代碼參考可用here,特別是ArtifactScanner.java

要麼這是API中的一個缺陷或缺陷,因爲似乎沒有任何其他方式來獲取將從給定編譯單元的源代碼生成的所有二進制名稱。我錯過了什麼嗎?

回答

0

其中一位JDK開發人員在this bug report上解釋說,觀察到的行爲確實不是一個錯誤,並且附加的類文件是由Java編譯器後端生成的,它在生成類之前將更復雜的語言結構重寫爲更簡單的語言結構文件。

因此,在這種情況下,TreePathScanner API確實會產生正確的輸出,但缺點是TreePathScanner是用於我的用例的錯誤解決方案(確定將生成的類文件的列表)以及該com應該使用.sun.source.util.TaskListener,TaskEvent和TaskEvent.Kind,以及JavaFileManager.inferBinaryName。