【问题标题】:What does `instanceof` check to determine object types?`instanceof` 检查什么来确定对象类型?
【发布时间】:2014-09-08 10:25:45
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

标签: java networking packet instanceof kryonet


【解决方案1】:

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

Instanceof

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

【讨论】:

  • 好的,感谢您的帮助。我今晚回家后会做一些测试并在这里发布结果
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 是的,它们是同一个类,只是代码不同,但你可能是对的。我必须更多地研究它。我仍然想进一步了解instanceof,它仍然可能会有所帮助。
    • 那么它们不是同一个类。它们是同名的两个不同的类。
    • 有没有关系,只要他们有相同的变量和方法,只是方法中的代码不同。
    【解决方案4】:

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

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

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多