我只是为了好玩而玩Java,我的背景主要是C ++,所以对于专业的Java开发人员来说,我的问题似乎有些奇怪。
假设我们有一个Bitmap
类填充了我们想要阅读的一些像素。当然,第一个最好的解决方案是getPixel
方法,但它会对每个像素进行一些不必要的检查,因此工作速度有点慢。我们可以使用getPixels
,但它会复制位图数据,使其大小加倍,并且我们的目标设备上没有太多的备用内存。更不用说,复制仍需要时间。
有没有办法让Java中的对象字段省略界面?
答案 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
字段。
毋庸置疑,这种方法非常脆弱,尤其是当您将其与第三方库一起使用时。