簡體   English   中英

`instanceof`檢查什么來確定對象類型?

[英]What does `instanceof` check to determine object types?

我正在使用kryonet從服務器和客戶端來回發送對象。 只要收到對象,就會運行一個偵聽器。 它似乎決定對象實例的唯一方法是使用:

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

我想知道什么是instanceof檢查以確定對象是否屬於特定類型。 它檢查類是否與所有代碼完全相同,是否檢查變量和名稱? 它也檢查導入的包嗎? 你給我的任何信息都可以提供幫助。

我想知道這個的原因是因為我制作數據包的方式,服務器方法中的代碼與客戶端不同。 例如,在我的客戶端發送數據包我做:

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

在我的服務器上我這樣做:

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

instanceof是一個jvm指令,它可能是本機代碼,但規范說它必須這樣做:

INSTANCEOF

真的不認為它檢查變量及其名稱,這是沒用的。 它必須遍歷類層次結構,直到它可以證明它是某種類型: extends,implements或它是同一個類

根據java docsisInstance#Object方法是Java語言instanceof運算符的動態等價物。

此方法測試是否可以通過標識轉換或擴展引用轉換將指定的Class參數表示的類型轉換為此Class對象表示的類型。

有關詳細信息,請參閱Java語言規范,第5.1.1和5.1.4節。

我想知道這個的原因是因為我制作數據包的方式,服務器方法中的代碼與客戶端不同。

我從未使用過Kryonet,但根據其文檔,這正是你不應該做的:

在客戶端和服務器上注冊完全相同的類並且它們以完全相同的順序注冊是非常重要的。

那么問問自己:為什么你在客戶端和服務器端使用不同的類? 你能找到一個抽象的“僅數據”類,它可以在雙方都有效並且只發送這個類嗎?

我的測試結果:一切都很重要(變量,方法,包裝聲明,你的名字!)

我不明白為什么人們說這是不准確的,它實際上對於我想做的事情來說太准確但我知道我需要做出哪些調整。

謝謝大家的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM