Pri použití Unsafe.getByte(byte[], long)
alebo Unsafe.putByte(long, byte[])
alebo akúkoľvek inú metódu get / put pre iné primitívne typy v časti Unsafe, dostanem NullPointerException. Toto je segment kódu:
byte[] data = new byte[]{0, 0, 0, 0, 0};
long offset = 0;
Unsafe unsafe = getUnsafe();
public byte at(long index) {
return unsafe.getByte(data, index + this.offset);
}
* Všetky polia sú konkretizované správne.
* Metóda getUnsafe () vráti inštanciu triedy Nebezpečné.
odpovede:
1 pre odpoveď č. 1Ak skúsim váš kód, dostanem a java.lang.SecurityException
pre Unsafe.getUnsafe()
, Ak túto výnimku nejako ignorujete, unsafe
môže skončiť byť null
, čo môže byť príčinou vašej výnimky.
Ak namiesto toho inicializujem nasledujúci kód unsafe
:
Unsafe unsafe = null;
try {
Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (sun.misc.Unsafe) field.get(null);
} catch (Exception e) {
throw new AssertionError(e);
}
všetko funguje a môžem použiť vaše at(...)
funkcie pre prístup k bajtom v poli, ak som nastavil offset
až 16. Možno to vyskúšaj a uvidíme, či to pomôže.
ALE!!! (ako už bolo uvedené vyššie v @StephenC), mali by ste sa vyhnúť použitiu tejto metódy! Napríklad sa možno nebudete môcť spoľahnúť na konkrétnu hodnotu offset
vzťahujúce sa na všetky VM. V niektorých bláznivých prípadoch sa môžu niektoré virtuálne počítače dokonca rozhodnúť zarovnať bajty vo vašom poli tak, aby ste ich museli zvyšovať. index
o 4 alebo 8, aby ste sa dostali k nasledujúcemu bajtu (toto je hádanie). Táto funkcia môže byť veľmi nepredvídateľná. Pochybujem tiež o tom, že je oveľa rýchlejšia než len používanie data[index]
, pretože ste do svojho kódu práve zaviedli volanie metódy. Ak potrebujete rýchlosť, nezabudnite sa tiež pozrieť priame NIO ByteBuffers.