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