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