Можно ли хранить массив байтов (необработанные данные) в файле класса java?


Я использую Apache BCEL для динамического создания классов java, каждый из которых будет иметь свой собственный ассоциированный образ. Эти сгенерированные классы реализуют следующий интерфейс:

interface ImageOwner {

    byte[] getImage();

}

При динамической реализации метода getImage я мог бы генерировать байт-коды для создания / возврата массива байтов при вызове метода, но я бы предпочел просто вернуть ссылку на массив байтов, если это возможно. Возможно ли хранить необработанные данные внутри файла класса java?

5 2

5 ответов:

Я действительно не уверен здесь, потому что это кажется слишком простым вопросом, но для полноты картины, это будет делать то, что я думаю, что вы хотите сделать:

public class ImageOwnerImpl implements ImageOwner {

    // A literal byte array. Tedious, but you could write code
    // to auto-generate this source from a file
    private byte[] imageByteArray = new byte[] { -128, 127, ...etc };

    public byte[] getImage() {
        return imageByteArray;
    }
}

Это литеральный массив байтов, который отвечает на ваш вопрос "как хранить байты в файле класса".

Большинство людей загрузили бы байты изображения из файла во время выполнения в конструкторе, однако у вас может быть какая-то особая потребность, которая гарантирует этот подход

После некоторых исследований лучшим способом, который я нашел для удовлетворения своих потребностей, было кодирование данных изображения base64 и использование пула констант для хранения результирующей строки. Даже при потере =~ 30% это кажется лучше, чем использовать конструктор или другие методы для инициализации поля массива байтов.

Просто определите класс Impl, который имеет статический инициализатор, который загружает необработанные данные из файла, включенного в ваш jar и загруженного через загрузчик классов.

Вы можете просто хранить его в виде массива байтов синтаксис массива в BCEL -

[B

Для массива байтов

[java.lang.String

Для массива строк и т. д.

Единственными константами, которые можно хранить в пуле констант, являются Ints, Floats, Longs, Double, Strings и Classes. Лучше всего просто сохранить его в виде строки и преобразовать в байт[] во время выполнения. Нет необходимости кодировать их в base64, поскольку строки могут обрабатывать нулевые символы, если вы применяете соответствующую модифицированную кодировку unicode.