【问题标题】:Is it possible to store a byte array(raw data) in a java class file?是否可以在 java 类文件中存储字节数组(原始数据)?
【发布时间】:2012-03-24 13:53:36
【问题描述】:

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

interface ImageOwner {

    byte[] getImage();

}

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

【问题讨论】:

  • 一个数组在java中的一个引用。我不确定你在问什么。
  • 我知道,我正在考虑从常量池或类似的东西中获取该引用。
  • 究竟“这种原始数据”是什么意思。
  • 那么“原始数据”是什么意思?数据就是数据。你到底在说什么?我们不明白你的意思。
  • 字节数组 = 原始数据(只是字节的集合)。我想在类中存储字节集合并在运行时检索它,而不是字符串或整数。

标签: java constants bcel .class-file


【解决方案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;
    }
}

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

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

【讨论】:

  • 这或多或少是我需要的,但我不想调用外部实用程序类来获取字节,而是希望将字节存储在类文件中并检索它在类体内
  • 如果我想要的东西是不可能的,你肯定知道,只需在答案中指定,我会标记为正确的。
  • @ThiadodeArruda 我已经编辑了代码以举例说明如何做到这一点
  • 这种方法的问题是这个新的字节数组实际上是在构造函数中创建的,它不仅会分配数组,还会发出操作码来存储每个字节,这是我试图避免的.由于 jvm 仅使用 4 字节整数操作,因此这样存储的字节数组将至少使用其实际空间的 4 倍,甚至不考虑创建字节数组并将每个字节存储在其自己的插槽中所需的字节码。这对于大型图像文件可能很不利。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以存储在常量池中的唯一常量是 Ints、Floats、Longs、Doubles、Strings 和 Classes。最好的办法是将其存储为字符串并在运行时将其转换为 Byte[]。无需对它们进行 base64 编码,因为字符串可以处理空字符,只要您应用适当的修改后的 unicode 编码。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        [B
        

        字节数组

        [java.lang.String
        

        对于字符串数组等

        【讨论】:

          猜你喜欢
          • 2013-10-23
          • 1970-01-01
          • 1970-01-01
          • 2018-07-19
          • 2014-04-30
          • 1970-01-01
          • 2021-04-16
          • 1970-01-01
          • 2014-05-21
          相关资源
          最近更新 更多