是否可以在java类文件中存储字节数组(原始数据)?

时间:2012-03-24 13:53:36

标签: java constants bcel .class-file

我正在使用Apache BCEL来动态创建每个都有自己关联图像的java类。这些生成的类实现以下接口:

interface ImageOwner {

    byte[] getImage();

}

当动态实现'getImage'方法时,我可以生成字节码来在调用方法时创建/返回字节数组,但我宁愿只返回对字节数组的引用(如果可能)。是否可以将原始数据存储在java类文件中?

5 个答案:

答案 0 :(得分:1)

我在这里真的不太确定,因为这个问题似乎太简单了,但为了完整起见,我会按照自己的意愿行事:

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;
    }
}

这是一个文字字节数组,它回答了“如何在类文件中存储字节”的问题。

大多数人会在运行时在构造函数中从文件加载图像字节,但是您可能有一些特殊需要保证这种方法

答案 1 :(得分:1)

经过一些研究,我发现满足我需求的最好方法是对图像数据进行base64编码,并使用常量池来存储生成的String。即使损失= ~30%,似乎比使用构造函数或其他方法初始化字节数组字段更好。

答案 2 :(得分:0)

只需定义一个具有静态初始化程序的Impl类,该静态初始化程序从包含在jar中并通过类加载器加载的文件加载原始数据。

答案 3 :(得分:0)

您可以将其存储为字节数组,BCEL中的数组语法为

[B

表示字节数组

[java.lang.String

表示字符串数组等。

答案 4 :(得分:0)

您可以在常量池中存储的唯一常量是Ints,Floats,Longs,Doubles,Strings和Classes。您最好的选择是将其存储为字符串并在运行时将其转换为Byte []。没有必要对它们进行base64编码,因为只要应用正确的修改后的unicode编码,字符串就可以处理空字符。