Подтвердить что ты не робот

ClassValue в Java 7

Во время просмотра документации по API Java 7 я наткнулся на новый класс java.lang.ClassValue со следующей довольно минимальной документацией:

Ленец ассоциировать вычисленное значение с (потенциально) каждым типом. Например, если динамический язык должен построить таблицу отправки сообщений для каждого класса, встречающегося на сайте отправки сообщения, он может использовать ClassValue для кэширования информации, необходимой для быстрого выполнения сообщения, для каждого встреченного класса.

Может ли кто-нибудь дать более подробное объяснение, какую проблему решает этот класс, и, возможно, некоторый пример кода или проект с открытым исходным кодом, который уже использует этот класс?

Обновление: Я по-прежнему интересуюсь каким-то фактическим исходным кодом или примерами, используя этот новый класс.

Я также нашел эту почту в списке рассылки mlvm-dev относительно некоторых улучшений в реализации. По-видимому, он изменился с использования WeakHashMap в новое частное поле на java.lang.Class, чтобы сделать его более масштабируемым.

4b9b3361

Ответ 1

Лучшим объяснением цели этого класса является то, что он решает Java Bug 6389107

Существует множество случаев, когда по какой-то причине требуется по существу Map<Class<?>, T>, но это вызывает всевозможные проблемы, поскольку объекты Class тогда не будут GC-совместимыми до тех пор, пока не появится Карта. WeakHashMap<Class<?>, T> не решает проблему, потому что очень часто T ссылается на класс.

В приведенной выше ошибке содержится гораздо более подробное объяснение и содержит примеры проектов/кода, которые сталкиваются с этой проблемой.

ClassValue - это ответ на эту проблему. Погрузочно-безопасный, загрузчик/разгрузочный загрузчик классов безопасный способ связывания данных с классом.

Ответ 2

С его целью разрешить добавление информации о времени выполнения в произвольные целевые классы (ссылка).

Я думаю, что он больше ориентирован на динамических программистов. Я не уверен, как это будет полезно для разработчиков общих приложений.

Первоначально класс находился в пакете java.dyn. Эта ошибка показывает, что она перемещается в java.lang.

Ответ 3

Ну, это абстрактный класс. Я нашел копию . Посмотрите на это.

Ответ 4

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;
}
};