Ответ 1
Методы в Java ограничены 64k в байтовом коде. Статические инициализации выполняются одним способом (см. ссылка)
Вы можете попытаться загрузить данные массива из файла.
У меня есть unit test, где я статически задал довольно большой массив байтов (более 8000 байт) в качестве байтовых данных файла, который я не хочу читать каждый раз, когда запускаю свой unit test.
private static final byte[] FILE_DATA = new byte[] {
12,-2,123,................
}
Это компилируется в пределах Eclipse, но при компиляции через Ant script я получаю следующую ошибку:
[javac] C:\workspace\CCUnitTest\src\UnitTest.java:72: code too large
[javac] private static final byte[] FILE_DATA = new byte[] {
[javac] ^
Любые идеи, почему и как я могу избежать этого?
Ответ: ответ Shimi сделал трюк. Я переместил массив байтов в отдельный класс и скомпилировал его. Спасибо!
Методы в Java ограничены 64k в байтовом коде. Статические инициализации выполняются одним способом (см. ссылка)
Вы можете попытаться загрузить данные массива из файла.
Вы можете загрузить массив байтов из файла в статическом методе @BeforeClass
. Это обеспечит загрузку только один раз для всех ваших модульных тестов.
Вы можете использовать внутренние классы, поскольку каждый из них будет иметь собственный предел в 64 КБ. Это может не помочь вам с одним большим массивом, поскольку внутренний класс будет обладать одним и тем же пределом статического инициализатора в качестве основного класса. Однако вы заявили, что вам удалось решить проблему, переместив массив в отдельный класс, поэтому я подозреваю, что вы загружаете больше, чем просто этот единственный массив в свой основной класс.
Вместо:
private static final byte[] FILE_DATA = new byte[] {12,-2,123,...,<LARGE>};
Try:
private static final class FILE_DATA
{
private static final byte[] VALUES = new byte[] {12,-2,123,...,<LARGE>};
}
Затем вы можете получить доступ к значениям как FILE_DATA.VALUES[i]
вместо FILE_DATA[i]
, но вы можете использовать ограничение на 128 Кбайт вместо 64 КБ.