開發 Eclipse 插件操作 Java 項目,可通過 IFile 獲取 src/ 下的 Java 文件,但無法直接獲得對應 bin/ 目錄下 .class 文件的 IClassFile 對象。嘗試用 IJavaProject.findType() 獲取 IType 再調用 getClassFile() 返回 null。
Eclipse 的 Java 模型中,IClasspathEntry 默認只包含源碼路徑(src/),輸出路徑(bin/)不在 Classpath 條目中。因此 Java 模型無法直接解析 bin/ 下的 Class 文件,導致 IType.getClassFile() 返回 null。
IJavaProject.getRawClasspath()。CPE_SOURCE)的輸出位置替換為 bin/ 目錄,或直接添加一個 CPE_LIBRARY 條目指向 bin/。IJavaProject.setRawClasspath(newEntries, monitor)(需在 IProgressMonitor 中執行)。findType() 獲取 IType 再調用 getClassFile() 獲得 IClassFile。IJavaProject javaProject = ...;
IClasspathEntry[] rawEntries = javaProject.getRawClasspath();
List newEntries = new ArrayList<>(Arrays.asList(rawEntries));
// 找到默認輸出位置(通常是 bin/)
IPath outputLocation = javaProject.getOutputLocation();
if (outputLocation != null) {
// 添加 bin/ 作為庫條目,使 Class 文件可被 Java 模型識別
IClasspathEntry binEntry = JavaCore.newLibraryEntry(outputLocation, null, null);
newEntries.add(binEntry);
}
// 必須應用到項目才能生效(會修改 .classpath 文件)
javaProject.setRawClasspath(newEntries.toArray(new IClasspathEntry[0]), new NullProgressMonitor());
// 現在可以獲取 IClassFile
IType type = javaProject.findType("com.example.MyClass");
IClassFile classFile = type.getClassFile(); // 不再為 null
setRawClasspath 會真實修改項目 .classpath 文件,建議在臨時項目副本或工作區備份後操作。bin/ 到 Classpath 會增加 Java 模型索引負擔,大型項目慎用。IFile 讀取 bin/ 下對應路徑文件流,再用 ASM/BCEL 解析,繞過 Java 模型。Eclipse Java 模型默認不索引輸出目錄。通過將 bin/ 加入 Classpath(以庫條目形式),可激活模型對 Class 文件的解析,從而獲得 IClassFile。操作會修改項目配置,生產環境插件需謹慎評估副作用。