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

在Java中从自己的进程读取内存,java,memory,artificial-intelligence,Java,Memory,Artificial Intelligence,我目前正在参加一个课程,我们必须编写一个AI来玩战舰,我们成功地制作了一个很棒的工作AI,但是我们的老师是个聪明的人,我想制作一个作弊AI,它读取记忆并查看对手AI放置战舰的位置 UI在单独的线程中运行,在主线程的逻辑上运行。船舶的位置存储在二进制二维数组中,其中true表示船舶上的一个点(不是船舶上的点,只是任何船舶) 现在的问题是:当enemyBoard的二维数组在同一进程和同一线程中运行时,是否有可能以某种方式读取该数组的内存?只有跳转到本机代码,才能直接访问内存。因此,我认为,实现这一点

我目前正在参加一个课程,我们必须编写一个AI来玩战舰,我们成功地制作了一个很棒的工作AI,但是我们的老师是个聪明的人,我想制作一个作弊AI,它读取记忆并查看对手AI放置战舰的位置

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


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

只有跳转到本机代码,才能直接访问内存。因此,我认为,实现这一点的唯一方法是JNI调用。

如果它在同一个进程中,并且您的类具有到驱动程序(从而间接到另一个数组)的任何类型的链接,那么您可以仅使用反射API获得它

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


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

一种方法是调用一段本机C/C++代码,该代码使用JNI接口从堆中复制数组内容。JNI提供了许多方法来读取/复制和操作堆上的对象。这是一个很好的开始