java中のinstance ofの実現原理

2944 ワード

instance ofの使用
obj instanceof class
注:Obj操作数の種類は、参照タイプまたは空欄タイプでなければなりません。そうでなければ、コンパイルが発生した時にエラーが発生します。
instance ofの実現原理
コード:
boolean rs;
if (obj == null) {
     
  rs= false;
} else {
     
  try {
     
      T temp = (T) obj; 
      rs= true;
  } catch (ClassCastException e) {
     
      rs = false;
  }
}
return rs;
  • obj==null、falseに戻る。
  • ObjがTに強制的に変換された場合、コンパイルエラーが発生し、falseに戻ります。
  • 運転時、Tなら!=null、そして(T)objはクラスCastExceptionを誘発しないで、trueに帰ります。
  • もしobjなら!=nullそして(T)objは、Class CastExceptionを誘発しないで、trueに戻ります。そうでないとfalseになります。
  • まとめ:obj==null、falseに戻ります。T)objはClass CastExceptionを誘発しないで、trueに戻ります。そうでないとfalseです。
    なぜClass CastExceptionを誘発しないのですか?
  • はSをobjのタイプのオブジェクトとし、SがTのサブタイプかどうかをチェックする。
  • S==Tの場合、trueに戻ります。
  • そうでなければ、サブタイプ検査を行います。
  • Sは配列タイプです。Tがクラスタイプであれば、TはObjectでなければなりません。Tがインターフェースタイプである場合、Tは配列によって実現されるインターフェースの一つでなければならない。
  • Sはインターフェースタイプです。Sを遍歴して実現されたインターフェースはTと一致していますか?
  • Sはクラスのタイプです。Sを遍歴したsuperチェーン(相続チェーン)はObjectまで行って、Tと一致するものがあるかどうかを見ます。エルゴードクラスのsuperチェーンは、このアルゴリズムの性能がクラスの継承深さに影響されることを意味する。)
  • 以上は一つの成立がある限り、SはTのサブタイプであり、そうでなければSはTのサブタイプではない。強制的に変換できないと、クラスCastExceptionが発生します。
    Hot SpotVM最適化
    クラスが継承するクラスオーバーと実装されるインターフェースは、実行時には変更されません。->これらの情報を保存できます。
    クラスの継承深さが0から7までの超分類を「主要スーパータイプ」といい、長さ8のキャッシュ・アレイに保存します。
    他のすべてのタイプ(インターフェース、配列関連、および深さ7を超えるスーパークラス)を「セカンドタイプ」と呼び、1つの配列に保存します。
    巡回する
    チェーンなどを巡回しない(性能が悪い)
  • は、直接に状況に応じて、主要なスーパータイプ配列
  • を巡回する。
  • は、状況に応じて、下付きを指定して取得し、下付きから順にスーパー型配列
  • を指定します。