2015-10-09 3 views
0
static boolean isClassLoaded(String fullname) { 
    try { 
     Class.forName(fullname, false, Loader.instance().getModClassLoader()); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 

Этот метод имеет потенциал для запуска статического инициализатора fullname? У меня проблема со статическим инициализатором, вызываемым дважды. , когда я пытаюсь проверить, загружен ли класс с использованием isClassLoaded, и попытайтесь использовать этот класс, я получаю ошибку из-за двойного конструктора. Кто-нибудь знает, что является проблемой с Class.forName (fullname, false, Loader.instance(). GetModClassLoader()); ?Java статический инициализатор, называемый дважды

+3

Непонятно, откуда берет 'Loader.instance(). GetModClassLoader()' и что он делает. Кроме того, вы говорите об «конструкторе, называемом дважды», но не о том, какой конструктор какого класса и как это относится к «статическому интериализатору» вашего названия вопроса. – Holger

+0

Я мог бы заменить их на ThisClass.class.getClassLoader(); – MCdevelopers

+0

В этом случае инициализатор не должен запускаться, и любое исключение в любом конструкторе не имеет ничего общего со статическими инициализаторами. – Holger

ответ

1

Второй параметр - это флаг, называемый «инициализировать».

docs От:

Класс инициализируется только если параметр инициализации верно и , если она не была инициализирована ранее.

Итак, если initialize установлен в false, он не будет выполнять ваши статические инициализаторы.

Самодостаточный пример

package test; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     Class.forName("test.Main$Foo", false, Main.class.getClassLoader()); 
     System.out.println("blah"); 
     Class.forName("test.Main$Foo", true, Main.class.getClassLoader()); 
    } 

    static class Foo { 
     static { 
      System.out.println("Foo static initializer"); 
     } 
    } 

} 

Выход

blah 
Foo static initializer 

Примечание всегда будет печатать Foo static initializer только один раз, но здесь, он печатает blah первый, то есть первый Class.forName вызов сделал не выполнять статический инициализатор.