2016-10-22 32 views
2

我正在製作一個分析器,它可以計算出java類的繼承樹的深度。如何找出java類繼承樹的深度?

我正在使用javaparser從java文件中確定此信息。

我該如何計算DIT?

我知道.getSuperClass(),但在解析java文件作爲靜態分析器的一部分時沒有用。

+1

這個問題太寬泛了,因爲你沒有提供上下文或代碼。一般來說,您必須遞歸地解析任何超類的類聲明和源代碼,直到找到「Object」。對於沒有源代碼的超類,您必須獲取源代碼(正確的版本)或從編譯的.class文件中提取類聲明。這是一個大型的複雜任務,解釋如何做所有事情都超出了StackOverflow的範圍。如果你不得不問這個問題,那麼你可能還沒有準備好解決整體問題。 –

+1

@JimGarrison我認爲這個想法很簡單...帶上任何java類,然後回溯到Object,計算出繼承的深度有多少個類 – srysry

+1

解釋「很簡單」,但有很多併發症沿途如處理您沒有源代碼的類。目前尚不清楚你要求什麼。你希望有人會爲你提供代碼嗎? –

回答

1

簡短的回答是:你不能單獨使用JavaParser來做到這一點,但你可以很容易地使用JavaSymbolSolver來做到這一點,該庫是一個用來補充JavaParser的庫,並且由支持JavaParser的同一團隊完成。

在實踐中,JavaParser只給你一個AST。在AST中,類的超類只是一個名字。 JavaSymbolSolver會爲您找到附加到該名稱的類型聲明。該聲明提供了查找所有祖先所需的所有信息,並回答了這個問題以及更多信息(例如,直接或間接實現了哪些接口,該類繼承了哪些字段,哪些方法等等)

免責聲明:我是JavaSymbolSolver的原作者

+1

這是否處理Java8的所有混亂?名稱解析規則非常複雜。你如何測試? –

+0

該代碼並不像您的商業產品那樣經過測試:) 這是一個相對年輕的項目,建立在空閒時間。在有些情況下,lambda類型推理不能正常工作,但只考慮超類,它應該可以很好地工作,同時也考慮通用參數。 我通過驗證它正確地解決了幾個項目的所有方法調用,使用的是Java 8 所以我不會賭在所有情況下這方面的工作完美的人壽命測試,但對這個問題考慮,我認爲它應該按預期工作,並且PR是受歡迎的:) –

+0

是的,它可能更容易獲得超類關係,而這正是DIT所需要的。 –