3

我正在使用 kryonet 从服务器和客户端来回发送对象。每当接收到对象时,就会运行一个侦听器。似乎确定对象实例的唯一方法是使用:

if(object instanceof ClientLoginPacket){
    //Do stuff
}

我想知道什么 instanceof 检查以确定对象是否属于特定类型。它是否检查类是否与所有代码完全相同,是否检查变量和名称?它是否也检查导入的包?你给我的任何信息都会有所帮助。

我想知道这一点的原因是因为我制作数据包的方式,服务器方法中的代码与客户端不同。例如,在我的客户端发送我做的数据包:

public void send(){
    Client.sendPacketTCP(this);
}

在我的服务器上我这样做:

public void send(){
    Server.sendPacketTCP(this);
}
4

4 回答 4

6

instanceof 是一条 jvm 指令,它可能是本机代码,但规范说它必须这样做:

实例

真的不认为它会检查变量及其名称,这是没用的。它必须遍历类层次结构,直到它可以证明它是某种类型:扩展、实现或者它是同一个类

于 2014-09-08T10:37:10.330 回答
2

根据java docsisInstance#Object方法是 Java 语言 instanceof 运算符的动态等价物。

此方法测试指定的 Class 参数表示的类型是否可以通过标识转换或扩展引用转换转换为此 Class 对象表示的类型。

有关详细信息,请参阅 Java 语言规范,第5.1.1和 5.1.4 节。

于 2014-09-08T10:39:16.740 回答
1

我想知道这一点的原因是因为我制作数据包的方式,服务器方法中的代码与客户端不同。

我从来没有使用过 Kryonet,但根据它的文档,这正是你不应该做的:

在客户端和服务器上注册完全相同的类并且它们以完全相同的顺序注册是非常重要的。

所以问问自己:为什么你在客户端和服务器端使用不同的类?你能找到一个抽象的“仅数据”类,它可以在双方都工作并且只发送这个类吗?

于 2014-09-08T10:35:12.623 回答
0

我的测试结果: 一切都很重要(变量、方法、包声明,随你怎么说!)

我不明白为什么人们说它不准确,它实际上对于我想做的事情来说太准确了,但我知道无论如何我需要做出哪些调整。

谢谢大家的帮助!

于 2014-09-08T23:12:31.637 回答