[英]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的一部分嗎?
如果不是,我猜這是一個版本問題。
否則,您應該留意您的庫的修正版本或打開票證。
最后但並非最不重要的是,您可以使用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-A對jar-B版本的期望匹配:)
對我來說這是最好的解決方案。
現在至於臟伎倆。 一個技巧可以是創建自己的CacheLookupUtil
副本並將其放入同一個包中,具體取決於類加載器策略(您沒有指定在哪個環境中運行,所以我假設是普通的java)它可能首先加載並有效地加載從jar中“替換” CacheLookupUtil
。
當然可以使用DefaultCacheResolverFactory
完成同樣的操作(這樣你就可以在那里修復no-op構造函數)
如果您認為它是一個真正的錯誤,另一個需要考慮的選擇是從“buggy”庫中分叉並使用修復程序創建自己的版本。 當然,你最好讓原始庫的開發人員修復這個bug,這樣你最終可以回到正式版本,在開源世界,有時這樣的解決方案,只要許可允許這樣做。
如果它沒有幫助,那么Byte Code操作是已經提到的@PowerStat修復的唯一方法。 我相信,Java代理,類加載修補,AspectJ等等。 希望你不會因為這個問題而到達那里:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.