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 docsによると、isInstance#Objectmethod は 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 に答える