Static блок инициализации

118
27 апреля 2018, 15:15

Можно привести пример, когда static блок инициализации отрабатывает 2 раза?

Answer 1

Вы правильно слышали, что блок статической инициализации отрабатывает столько раз, сколько класс загружается classloader-ом. Но так как classloader не будет дважды загружать класс, единственный способ добиться повторного вызова блока статической инициализации - это использовать второй classloader:

SomeClass.java

package com.example;
public class SomeClass {
    static {
        System.out.println("Static initialization");
    }
}

Компилируем и упаковываем

> javac -d test SomeClass.java
> jar cf test.jar -C test .

Main.java

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class Main {
    public static void main(String args[]) throws MalformedURLException {
        String pathToJar = "file:////D:/playground/java/test.jar";
        String className = "com.example.SomeClass";
        URL url = new URL(pathToJar);
        try (URLClassLoader cl1 = new URLClassLoader(new URL[] { url });
             URLClassLoader cl2 = new URLClassLoader(new URL[] { url })) {
            Class<?> c1 = cl1.loadClass(className);
            Class<?> c2 = cl2.loadClass(className);
            c1.newInstance();
            c2.newInstance();
        }
        catch (InstantiationException | IllegalAccessException | ClassNotFoundException exc) {
            exc.printStackTrace();
        }
        catch (IOException exc) {
            exc.printStackTrace();
        }
    }
}

Компилируем и запускаем

> javac Main.java
> java Main

Вывод, как и ожидалось

Static initialization
Static initialization
READ ALSO
Java. Как долго создаются объекты, экономить?

Java. Как долго создаются объекты, экономить?

Очень часто в java создаются новые объекты для различных, и порой, примитивнейших целейНапример rowMapper, дто для перегонки с энтити, в лямбдах...

119
Ввести 3 массива

Ввести 3 массива

Нужно ввести 3 массива на java,Массивы 1)Имена студентов,2)Предметы, 3)Содержат имена+предметы и ещё оценкиНужно чтоб потом выводились данные...

143
java.lang.StackOverflowError

java.lang.StackOverflowError

Существует ркурсивный вызов метода

158