如何在Java中获取封装数据省略类接口?

时间:2013-06-01 09:52:33

标签: java encapsulation

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

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

有没有办法让Java中的对象字段省略界面?

1 个答案:

答案 0 :(得分:3)

Java提供了一种用于编写名为Reflection的动态程序的便捷工具。 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类的私有字段,按名称and access the array through reflection as if it were public获取rawData字段。

毋庸置疑,这种方法非常脆弱,尤其是当您将其与第三方库一起使用时。