2015-08-12 2 views
4

Так, в качестве примера у меня есть этот JNI код:Как явным образом вызвать статический инициализатор в Java?

/** This literally does nothing. It's purpose is to call the static initializer early to detect if we have issues before loading. */ 
public static void nothing() { 

} 

static { 
    // should be loaded by CLib 
    if (CLib.hasGNUTLS() == 1) { 
     globalinit(); 
    } 
} 

я считаю себя буквально создание функции не называется «ничего», чтобы назвать это раньше, если это необходимо, но я также хочу это называется, если он ссылается ранее или если мы не называем nothing(). Теперь я мог бы сделать какую-то неприятную логику, включающую проверку булевых, но тогда вы попадаете в поточную безопасность и бла. Полагаю, вы могли бы, но это некрасиво. Есть ли способ явно позвонить GNUTLS.<clinit>();?

+0

Чтобы уточнить: цель метода «ничего» заключается в том, чтобы убедиться, что класс загружен, правильно? Вам нужно загрузить класс, чтобы его статический инициализатор выполнялся, хотя вам не нужно ничего делать * else * с классом, но, кроме того, чтобы JVM загружал его. – Wyzard

+0

http://stackoverflow.com/questions/31027000/does-jvm-load-all-the-classes-mentioned-by-the-classpath/31028160#31028160 – ZhongYu

ответ

2

Статический инициализатор всегда запускается перед вашим методом, поскольку инициализатор запускается, когда инициализируется класс . JLS-8.7. Static Initializers говорит (частично)

статический инициализатор объявлен в классе выполняется, когда класс инициализируется (§12.4.2). Вместе с инициализаторами полей для переменных класса (§8.3.2) статические инициализаторы могут использоваться для инициализации переменных класса класса.

И нет никакого способа явно вызвать любой инициализатору (static или иначе). Тем не менее, Class.forName(String) говорит (частично)

Вызов forName("X") вызывает класс с именем X для инициализации.

+0

Да, я знаю. Это не мой вопрос. Вы должны ссылаться на класс для его загрузки, а затем вызывать статический инициализатор, поэтому 'nothing()' ссылаться на класс. – JavaProphet

+1

Вы можете взглянуть на ['Class.forName (String)'] (https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName%28java.lang. Строка% 29). И да, вам нужно обратиться к классу, чтобы он был загружен. –

+1

Непонятно, но я думаю, что идея состоит в том, чтобы вызвать метод do-nothing только для запуска загрузки классов - не так или иначе вызвать статический инициализатор (снова) из * внутри * метода. – Wyzard

Смежные вопросы