`instanceof`检查什么来确定对象类型?

时间:2014-09-08 10:25:46

标签: java networking packet instanceof kryonet

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

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:6)

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

Instanceof

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

  

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

我从未使用过Kryonet,但根据其documentation,这正是你不应该做的:

  

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

请问自己:为什么在客户端和服务器端使用不同的类?你能找到一个抽象的数据吗?#34;哪个类可以在双方都工作,只发送这个?

答案 3 :(得分:0)

我的测试结果 一切都很重要(变量,方法,包装声明,你的名字!)

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

谢谢大家的帮助!