我使用Apache BCEL动态创建java类,每个类都有自己的关联映像。这些生成的类实现了以下接口:
interface ImageOwner {
byte[] getImage();
}
当动态实现"getImage"方法时,我可以在调用该方法时生成字节码来创建/返回字节数组,但如果可能的话,我宁愿只返回对字节数组的引用。是否可以将原始数据存储在java类文件中?
我真的不确定,因为这似乎是一个太简单的问题,但为了完整性,这将做我认为你想做的事情:
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编码,并使用常量池来存储结果String。即使损失=~30%,它似乎也比使用构造函数或其他方法初始化字节数组字段要好。
可以存储在常量池中的常量只有Ints、Floats、Longs、Doubles、Strings和Classes。您最好将其存储为字符串,并在运行时将其转换为Byte[]。不需要对它们进行base64编码,因为只要应用正确的修改后的unicode编码,字符串就可以处理空字符。
只需定义一个Impl类,该类具有一个静态初始化程序,该初始化程序从包含在jar中并通过类加载器加载的文件中加载原始数据。
您可以将其存储为字节数组,BCEL中数组的语法为
[B
对于字节阵列
[java.lang.String
对于字符串数组等,