从Java中读取自己进程的内存

时间:2011-04-01 08:53:07

标签: java memory artificial-intelligence

我目前正在参加一个我们必须编写AI来玩战舰的课程,我们设法推出了一个很棒的工作,但我们的老师是一个聪明的人,我想做一个作弊AI,读取记忆并查看对手AI放置船只的位置。

UI在一个单独的线程中运行,它在主线程中的逻辑上运行observer pattern。船舶的位置存储在二进制二维数组中,其中true表示船上的一个点(不是任何船只)。

现在的问题是:当它在同一个进程和同一个线程中运行时,是否有可能以某种方式读取enemyBoard的二维数组的内存?

4 个答案:

答案 0 :(得分:4)

如果它在同一个进程中并且您的类具有到驱动程序的任何类型的链接(因此间接到另一个数组),则可以仅使用反射API来获取它。

答案 1 :(得分:3)

这样做的一种方法是调用一段使用JNI接口从堆中复制数组内容的本机C / C ++代码。 JNI提供了许多用于读取/复制和操作堆上对象的方法。 official documentation是一个很好的起点。

答案 2 :(得分:1)

只有在深入了解本机代码时,才能直接访问内存。所以,我想,唯一的方法是进行JNI调用。

答案 3 :(得分:1)

在Java中,您没有像在C / C ++中那样对内存进行原始访问。所以你可以尝试使用JNI来获取原始内存。

另一种选择可能是使用反射。如果你的代码引用了对手所拥有的任何对象,那么你可以访问它的字段,甚至是私有字段。