簡體   English   中英

JAVA字節碼優化

[英]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對象,因此在使用單個類加載器時應該安全地比較它們

包命名約定的一個問題是您必須在整個代碼庫中強制執行和維護它,隨着時間的推移,這可能會成為維護問題。 識別類的更明確的方法可能會更好。

識別特定類別組的替代方法包括:

  • 使您的元數據 bean 實現標記接口
  • 使用 Java Annotations 標記元數據 bean
  • 使所有bean 實現一個公共接口,並帶有一個方法,可以調用該方法來檢查它們是否屬於您定義的特定類別。 這很丑陋,因為它基本上復制了類型系統,但速度很快,因為它不需要反射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM