我正在使用Apache BCEL来动态创建每个都有自己关联图像的java类。这些生成的类实现以下接口:
interface ImageOwner {
byte[] getImage();
}
当动态实现'getImage'方法时,我可以生成字节码来在调用方法时创建/返回字节数组,但我宁愿只返回对字节数组的引用(如果可能)。是否可以将原始数据存储在java类文件中?
答案 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编码,字符串就可以处理空字符。