1

我玩 Java 只是为了好玩,我的背景主要是 C++,所以我的问题对于专业的 Java 开发人员来说可能有点奇怪。

假设我们有一个Bitmap类填充了我们想要读取的一些像素。当然,第一个最好的解决方案是getPixel方法,但是它对每个像素进行一些不必要的检查,因此工作起来有点慢。我们可以使用getPixels,但它会将位图数据复制到两倍大小,并且我们的目标设备上没有太多备用内存。更不用说,复制仍然需要时间。

有没有办法让Java中的对象字段省略接口?

4

1 回答 1

3

Java 提供了一种方便的工具来编写称为反射的动态程序。在 C++ 中最接近它的是RTTI,但反射要复杂得多。除其他外,它还允许您访问对象的私有字段。

假设第三方Bitmap看起来像这样:

class Bitmap {
    private byte[] rawData;
    private int rows;
    private int cols;
    public int getPixel(int x, int y) {
        if (x < 0 || x >= cols || y < 0 || y >= rows) {
            throw new ...
        }
        int offset = 3*(rows*y + x);
        return (rawData[offset] << 16)
             | (rawData[offset+1] << 8)
             | rawData[offset+2];
    }
}

假设您想避免通过直接getPixel访问每个像素的方法rawData,但该字段不是公共的。您可以通过反射检查类的私有字段,按名称Bitmap获取其字段,并通过反射访问数组,就好像它是 public 一样rawData

不用说,这种方法极其脆弱,尤其是当您将它与第三方库一起使用时。

于 2013-06-01T10:17:48.250 回答