Java-класс делает что-то вроде следующего
public class Foo {
private final NativeCallbackHandler handler;
public Foo(NativeCallbackHandler handler) {
// I've shortened this for exposition, callSomeNativeMethod
// really happens in a superclass that I don't own (and is
// part of the lib that gives me the native part)
callSomeNativeMethod();
this.handler = handler;
}
public void handleNativeCallback(Object args) {
this.handler.callback(args);
}
private native int callSomeNativeMethod();
}
Можно предположить, что нативный метод делает что-то, что может привести к вызову нативного кода handleNativeMethod
У меня есть 2 связанных вопроса
- Я считаю, что нативный код должен вызывать дескриптор этого объекта, а также вызывать
GetMethodID
, чтобы получить доступ к вызываемому методу. Возможно ли, чтобы этот нативный код вызывал метод до объект полностью инициализирован?
- Если это возможно, какова семантика неинициализированного конечного поля?
если 1 - да, тогда я ожидаю, что 2 взорвется при доступе к нему, и, следовательно, я предполагаю, что нам нужно сделать его AtomicReference
, чтобы получить к нему безопасный доступ без взрыва.
Примечание. Я не контролирую поведение нативной библиотеки.