[英]JAVA bytecode optimization
這是一個基本問題。
我有不應在元數據 bean 上運行的代碼。 所有元數據 bean 都位於元數據包下。
現在,
我使用反射 API 來找出某個類是否位於元數據包中。
if (newEntity.getClass().getPackage().getName().contains("metadata"))
我在這段代碼的幾個地方使用了這個 If。
問題是:我應該這樣做一次:
boolean isMetadata = false
if (newEntity.getClass().getPackage().getName().contains("metadata")) {
isMetadata = true;
}
C++ 進行了優化,並且知道這段代碼已經被調用過,它不會再調用它。 JAVA 做優化了嗎? 我知道反射 API 是一個節拍,我不想失去昂貴的運行時。
在將任何工作投入優化之前,您當然應該檢查是否真的存在性能問題。 getClass()
可能已經相當快了(無論如何都比instanceof
快)。 您可能會緩存元數據包中的一組類,這樣您就無需繼續檢查包名稱。
如果你真的需要比較包,你可以使用Package.getPackage(String name)方法找到一次元數據包,然后對於每個對象,像以前一樣調用getClass().getPackage()
,比較兩個包對象。
這比檢查包名稱中的字符串更快、更優雅,但如果有多個類加載器,則可能無法正常工作,因為 Package 對象不會相等 ( ==
) 並且 Package 不會覆蓋.equals()
。 考慮一下,它甚至可能不能保證在單個類加載器上工作,但我懷疑在實踐中你會得到相同的 Package 實例而不是另一個副本 - 首先檢查這個是明智的!,例如:
String.class.getPackage() == Integer.class.getPackage() // should be true
如果您檢查Class.getPackage()
、 Package.getPackage()
和ClassLoader.getPackage()
的源代碼,則更新您可以看到它們緩存了Package
對象,因此在使用單個類加載器時應該安全地比較它們
包命名約定的一個問題是您必須在整個代碼庫中強制執行和維護它,隨着時間的推移,這可能會成為維護問題。 識別類的更明確的方法可能會更好。
識別特定類別組的替代方法包括:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.