Остановите загрузку одноэлементного класса дважды с помощью другого Classloader [duplicate]

Я не могу прокомментировать верхние ответы, чтобы сказать это: я хотел бы добавить явную точку, которая подразумевается только в верхних ответах:

Нехватывающая группа (?...) не удаляет символов из исходного полного совпадения, он визуально реорганизует регулярное выражение программисту.

Чтобы получить доступ к определенной части регулярного выражения без определенных посторонних символов, вам всегда нужно будет использовать .group(<index>)

12
задан Till Helge 1 March 2013 в 13:40
поделиться

2 ответа

Если вам нужна истинная Singleton для загрузчиков классов, вам нужен общий родитель для загрузки рассматриваемого класса или вам нужно указать загрузчик классов самостоятельно.

Обновление: из комментария от @ Pshemo ниже справедливой части содержимого в блоге ниже может появиться непосредственно из статьи JavaWorld . Я оставил запись в блоге, так как он все равно может помочь кому-то, но стоит знать, откуда изначально вышло.

Оригинал: есть запись blog , которая дает вам способ сделать это »(хотя я и не пробовал это!), и он выглядит довольно разумно

. В соответствии с нижеприведенным здесь фрагментом кода из моей ссылки выше - я предлагаю вам посетить блог, хотя для полного context:

private static Class getClass(String classname) throws ClassNotFoundException {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    if(classLoader == null) 
        classLoader = Singleton.class.getClassLoader();
      return (classLoader.loadClass(classname));
}
25
ответ дан Sean Landsman 26 August 2018 в 09:15
поделиться

Это хак, злоупотребляющий тем фактом, что Properties расширяет Map, старое неудачное дизайнерское решение.

public final class JvmWideSingleton
{
    private static final JvmWideSingleton INSTANCE;

    static {
        // There should be just one system class loader object in the whole JVM.
        synchronized(ClassLoader.getSystemClassLoader()) {
            Properties sysProps = System.getProperties();
            // The key is a String, because the .class object would be different across classloaders.
            JvmWideSingleton singleton = (JvmWideSingleton) sysProps.get(JvmWideSingleton.class.getName());

            // Some other class loader loaded JvmWideSingleton earlier.
            if (singleton != null) {
                INSTANCE = singleton;
            }
            else {
                // Otherwise this classloader is the first one, let's create a singleton.
                // Make sure not to do any locking within this.
                INSTANCE = new JvmWideSingleton();
                System.getProperties().put(JvmWideSingleton.class.getName(), INSTANCE);
            }
        }
    }

    public static JvmWideSingleton getSingleton() {
        return INSTANCE;
    }
}

Это можно сделать параметризованным, но тогда инициализация будет ленивой и пройдет на getSingleton().

Properties на Hashtable, поэтому он является потокобезопасным (согласно документации). Таким образом, можно использовать props.computeIfAbsent(). Но мне это нравится больше.

Также читайте здесь: Область свойств Java System

Я только что написал это, и есть шанс, что есть что-то Я забыл, что это помешало бы этому работать.

0
ответ дан Ondra Žižka 26 August 2018 в 09:15
поделиться
Другие вопросы по тегам:

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