Java 6 и SwingUtilities2

Редактировать: Как отмечает j_random_hacker, можно заставить пользователя объявить именованный объект, чтобы снять блокировку.

Однако, даже если создание временных таблиц было каким-то образом запрещено для вашего класса, то пользователь может совершить аналогичную ошибку:

// take out a lock:
if (m_multiThreaded)
{
    CSingleLock c(&m_criticalSection, TRUE);
}

// do other stuff, assuming lock is held

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

Другая вероятная ошибка:

 CSingleLock *c = new CSingleLock(&m_criticalSection, TRUE);

 // do other stuff, don't call delete on c...

Что заставит вас спросить: «Могу ли я как-нибудь помешать пользователю моего класса распределить его по куче»? На что ответ будет таким же.

В C ++ 0x будет еще один способ сделать все это, используя лямбды. Определите функцию:

template <class TLock, class TLockedOperation>
void WithLock(TLock *lock, const TLockedOperation &op)
{
    CSingleLock c(lock, TRUE);
    op();
}

Эта функция фиксирует правильное использование CSingleLock. Теперь позвольте пользователям делать это:

WithLock(&m_criticalSection, 
[&] {
        // do stuff, lock is held in this context.
    });

Это намного сложнее для пользователя испортить. Сначала синтаксис выглядит странно, но [& amp;], за которым следует блок кода, означает «Определить функцию, которая не принимает аргументов, и если я ссылаюсь на что-либо по имени, и это имя чего-то вне (например, локальная переменная содержащий функцию) позвольте мне получить доступ к ней по неконстантной ссылке, чтобы я мог ее изменить.)

5
задан Georg Schölly 19 October 2009 в 21:52
поделиться

4 ответа

If you have absolutely no other choice, then you should figure out exactly what it was that the class is using from SwingUtilities2, and then make proxies for that functionality in your own SwingUtilities2. You can then stick it in your own com.sun.java.swing package, which will overlap with the original one, and if the same class loader that loads your component is also aware of SwingUtilities2, then the one will see the other and your application will work.

Depending on what the component is, and what it used out of SwingUtilities2, this could be significantly harder than upgrading it or even rewriting it.

5
ответ дан 14 December 2019 в 04:42
поделиться

Да-дум! Именно поэтому вам следует обращать внимание на эти надоедливые предупреждения, призывающие не полагаться на внутренние компоненты JVM!

1
ответ дан 14 December 2019 в 04:42
поделиться

Единственный правильный способ (избежать взлома) - это попросить поставщика исправить и пересобрать этот компонент до Java 6 Возможный рабочий способ - скопировать sun.swing.SU2 в com.sun ... SU2 и упаковать его в отдельный jar (например, java6fix.jar) и попытаться запустить ваше приложение. Будет хорошо, если вы добавите этот патч-jar в jvm bootclasspath. Лучшим патчем должно быть создание собственного com.sun..SU2 и делегирование всех вызовов sun.swing.SU2. И обратите внимание на другую версию компонента, поддерживающую Java6, возможно, от другого производителя. Также, если проблема только в указанной строке ((Boolean) c.getClientProperty (AA_TEXT_PROPERTY_KEY)); , вы можете указать собственное свойство клиента для этого компонента, чтобы предотвратить NPE. Выбрав этот путь, вы можете просто создать свой собственный com.sun ... SU2. AA_TEXT_PROPERTY_KEY и вызовите c.setClientProperty (AA_TEXT_PROPERTY_KEY, true) для этого компонента. Также попробуйте отключить проверку сглаживания на компоненте, если это возможно.

1
ответ дан 14 December 2019 в 04:42
поделиться

Просто не знаю, сработает ли это.

Попробуйте вытащить класс SwingUtilities2 и поместить его в банку с исправлениями, включив эту банку в свой путь к классам. Надеюсь, это сработает, пока вы не измените источник.

1
ответ дан 14 December 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: