簡體   English   中英

Java - 使用實例化反射來防止字段分配?

[英]Java - prevent field assignment using reflection on instantiation?

我在第三方庫中有一個java類,其私有成員在類實例化時分配。

public class CacheLookupUtil extends AbstractCacheLookupUtil<InvocationContext> {
  @Inject
  private BeanManagerUtil beanManagerUtil;

  private CacheKeyGenerator defaultCacheKeyGenerator = new DefaultCacheKeyGenerator();
  private CacheResolverFactory defaultCacheResolverFactory = new DefaultCacheResolverFactory();

  ...
  ...
}

我的問題是defaultCacheResolverFactory的賦值由於選擇了錯誤的構造函數而導致異常。

如果我嘗試將CacheLookupUtil子類CacheLookupUtil ,那么這個賦值仍然在父類中完成,所以我沒有更進一步。

有沒有我可以在Java反射中使用的機制允許我構造/實例化對象,但是阻止了defaultCacheResolverFactory的賦值,並允許我通過反射設置值?

我知道這是一個丑陋的解決方案,但說實話,我無法想象任何其他方式繼續下去。

DefaultCacheResolverFactory是庫jar的一部分嗎?

  1. 如果不是,我猜這是一個版本問題。

  2. 否則,您應該留意您的庫的修正版本或打開票證。

  3. 最后但並非最不重要的是,您可以使用AspectJ Load-Time Weaving在類加載時操作字節碼。 但這要求您始終使用Load-Time Weaving啟動代碼。 請參閱加載時編織

所以我個人更喜歡選項1或2。

檢查包含CacheLookupUtil的庫的版本(我理解它是第三方類)。 例如,讓它成為jar-A

然后檢查包含DefaultCacheResolverFactory的jar版本。 如果它也是jar-A ,這實際上意味着這個庫在這個版本上不起作用,所以你應該升級。 如果它在某個jar-B中 ,那么檢查jar-A本身的pom.xml ,需要什么版本的jar-B依賴,可能你會覆蓋這個jar的版本。

然后調整版本,以便jar-Ajar-B版本的期望匹配:)

對我來說這是最好的解決方案。

現在至於臟伎倆。 一個技巧可以是創建自己的CacheLookupUtil副本並將其放入同一個包中,具體取決於類加載器策略(您沒有指定在哪個環境中運行,所以我假設是普通的java)它可能首先加載並有效地加載從jar中“替換” CacheLookupUtil

當然可以使用DefaultCacheResolverFactory完成同樣的操作(這樣你就可以在那里修復no-op構造函數)

如果您認為它是一個真正的錯誤,另一個需要考慮的選擇是從“buggy”庫中分叉並使用修復程序創建自己的版本。 當然,你最好讓原始庫的開發人員修復這個bug,這樣你最終可以回到正式版本,在開源世界,有時這樣的解決方案,只要許可允許這樣做。

如果它沒有幫助,那么Byte Code操作是已經提到的@PowerStat修復的唯一方法。 我相信,Java代理,類加載修補,AspectJ等等。 希望你不會因為這個問題而到達那里:)

暫無
暫無

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

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