我需要創建匿名的內部類型,這些內部類型構建起來非常昂貴,並且需要訪問其中的最終變量。問題是我需要創建其中的很多,唯一不同的是使用的最終變量不同(對象本身和類型)。如何重用javas匿名內部類如果他們採取不同的最終參數?
是否有可能以更可重複的方式做到這一點?
一個簡單的例子:
final Object aNeededParameter = "test";
Object expensiveToBuild = new ExpensiveInnerType() {
public void doSomething() {
aNeededParameter.toString();
}
});
我需要爲不同的對象expensiveToBuild的實例的同時,例如1L,新日期(), 「另一個類似的用例」
基本想法是在運行時爲具體類的不同序列化實例創建代理,並在首次使用時反序列化這些對象。我做了一個工作示例(鏈接在底部),但代理創建非常昂貴。
有一個ProxyFactory需要一個MethodHandler來通過字節碼增強來創建一個Proxy對象。 MethodHandler定義了一個方法
invoke(Object self, Method realMethod, Method proxyMethod, Object[] args) throws Throwable
在我的情況下,這個方法需要訪問一個byte [],它包含代理構建的序列化對象。所以我必須創建一個新的MethodHandler併爲我想要代理的每個對象構建/編譯一個新的Proxy對象。
在原始對象的每個方法調用之前自動調用invoke方法,並簡單地檢查該對象是否初始化,如果不是,則對其進行反序列化。之後,它調用原始對象上的調用方法。
如果你想看到具體的用例看這裏:
Lazy deserializationproxy for java
,並通過構造函數傳遞給該類必要的最後一個變量。 – Vulcan
並使用泛型來處理不同類型 – Aubin
我認爲創建一個匿名內部類的實例是他所關心的昂貴部分,而不是類的實際定義。 –