2011-09-16 53 views
33

在瀏覽時我新類java.lang.ClassValue具有以下而最小文檔絆倒了Java API 7文檔:ClassValue Java 7中

懶洋洋與(潛在的)每一種類型的計算值相關聯。例如,如果動態語言需要爲在消息發送呼叫站點遇到的每個類構造一個消息分派表,則可以使用ClassValue來緩存爲遇到的每個類而快速執行消息發送所需的信息。

任何人都可以更好地解釋這個類解決什麼問題,也許一些示例代碼或開源項目已經使用這個類?

更新:我仍然對一些實際的源代碼或使用這個新類的例子感興趣。

我也發現this mail on the mlvm-dev mailing list關於一些實施改進。它顯然是從使用WeakHashMap到java.lang.Class上的一個新的專用字段,使其更具可擴展性。

+0

閱讀您鏈接到API建議對我說,'得到()'方法是線索的最佳場所。然而,我不明白爲什麼'get()'方法有一個'Class'對象。 – Raedwald

+0

目前關於core-libs郵件列表(http://mail.openjdk.java.net/pipermail/mlvm-dev/2013-April/005321.html)的討論關於Groovy中ClassValue的使用及其與班級卸貨。 –

回答

9

的這個類的目的,最好的解釋是,它解決了Java Bug 6389107

有其中一個想基本上有某種原因Map<Class<?>, T>許多用例,但這會導致各種各樣的麻煩,因爲Class對象將那麼在Map之前不能進行GC分析。 WeakHashMap<Class<?>, T>並不能解決問題,因爲非常頻繁地,T引用該類。

上面的bug進入了一個更詳細的解釋,幷包含面臨此問題的示例項目/代碼。

ClassValue是解決此問題的答案。線程安全的類加載器加載/卸載將數據與類關聯的安全方式。

6

其目的是允許將運行時信息添加到任意目標類(reference)。

我認爲它更多地針對動態語言程序員。但我不確定它對於一般的應用程序開發人員來說是如何有用的。

最初班上有java.dyn包。 This bug顯示它移動到java.lang。

1

嗯,這是一個抽象類。我找到了一個copy。看看它。

+2

下面是[語法突出顯示](http://code.google.com/p/jsr308-langtools/source/browse/src/share/classes/java/lang/ClassValue.java?repo=basic-jdk)複製。 –

1

ClassValue緩存關於類的東西。 這裏是(在Lucene的5.0 AttributeSource.java)的代碼的一部分

/** a cache that stores all interfaces for known implementation classes for performance (slow reflection) */ 
    private static final ClassValue<Class<? extends Attribute>[]> implInterfaces = new ClassValue<Class<? extends Attribute>[]>() { 
@Override 
protected Class<? extends Attribute>[] computeValue(Class<?> clazz) { 
    final Set<Class<? extends Attribute>> intfSet = new LinkedHashSet<>(); 
    // find all interfaces that this attribute instance implements 
    // and that extend the Attribute interface 
    do { 
    for (Class<?> curInterface : clazz.getInterfaces()) { 
     if (curInterface != Attribute.class && Attribute.class.isAssignableFrom(curInterface)) { 
     intfSet.add(curInterface.asSubclass(Attribute.class)); 
     } 
    } 
    clazz = clazz.getSuperclass(); 
    } while (clazz != null); 
    @SuppressWarnings({"unchecked", "rawtypes"}) final Class<? extends Attribute>[] a = 
     intfSet.toArray(new Class[intfSet.size()]); 
    return a; 
} 
};