17

たとえば、内部クラスがある場合

class Outer{
    class Inner{}
}

外部オブジェクトに関係なく、任意Objectのインスタンスが任意のインスタンスであるかどうかを確認する方法はありますか? オブジェクトが同じ からの ではない場合、 false を返します。回避策は静的クラスを作成することだけであることは知っていますが、私が求めていることが可能かどうか疑問に思っています。InnerinstanceofInnerOuterInner

例:

class Outer{
    Inner inner = new Inner();
    class Inner{}

    public boolean isInner(Object o){
        return o instanceof Inner;
    }
}


Outer outer1 = new Outer();
Outer outer2 = new Outer();
boolean answer = outer1.isInner(outer2.inner); //gives false
4

6 に答える 6

19

そして何について?

public static boolean isInnerClass(Class<?> clazz) {
    return clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers());
}

このメソッドisMemberClass()は、メソッドがメンバー (匿名クラスまたはローカル クラスではない) であるかどうかをテストし、2 番目の条件は、メンバー クラスが静的でないことを確認します。

ちなみに、ドキュメントでは、ローカル、匿名、およびネストされたクラスの違いについて説明しています。

ネストされたクラスは、静的クラスと非静的クラスの 2 つのカテゴリに分類されます。静的と宣言された入れ子になったクラスは、単に静的な入れ子になったクラスと呼ばれます。ネストされた非静的クラスは、 内部クラス と呼ばれます

于 2013-07-04T11:00:55.787 に答える
4

o instanceof Outer.Innerは、呼び出し元以外のインスタンスである場合を示しますfalseoInnerOuter

これは私には起こりません-の特定の囲みインスタンスが属しているに関係なく取得しtrueます:o instanceof InnerOutero

class Outer {
  class Inner {}

  void test() {
    // Inner instance that belongs to this Outer
    Inner thisInner = new Inner();

    // Inner instance that belongs to a different Outer
    Outer other = new Outer();
    Inner otherInner = other.new Inner();

    // both print true
    System.out.println(thisInner instanceof Inner);
    System.out.println(otherInner instanceof Inner);
  }

  public static void main(String[] args) {
    new Outer().test();
  }
}

Java 6 と 7 の両方でテスト済み。

于 2013-07-04T12:01:35.043 に答える
2

あなたはいつでもできます:

getClass().getName()

文字列比較を行います。

編集:継承を説明するために(内部クラス間で?誰がそれをしますか?!)、いつでもループしgetSuperclass()てそれらをチェックし、実装されたインターフェースを追跡することさえできます。

于 2013-07-04T10:42:01.900 に答える
2

getEnclosingClass()を使用してみましたか:

基になるクラスのすぐ外側のクラスを返します。基になるクラスが最上位クラスの場合、このメソッドは null を返します。

Outer.class.equals(object.getClass().getEnclosingClass())

オブジェクトの正しいエンクロージング クラスを取得するのは簡単ではありません。これを読んでください。

多少のハックは次のとおりです。

object.getClass().getName().contains("Outer$");
于 2013-07-04T10:43:50.690 に答える
0

より良い答えを見つけるためにグーグルで検索していましたが、そこには何もないことがわかりました。

これが私が持っているもので、かなりうまく機能します:

    public static boolean isStatic(Class klass) {
            return Modifier.isStatic(klass.getModifiers());
    }

    /**
     * Non static inner class
     */
    public static boolean isInnerclass(Class klass) {
            return klass.getDeclaringClass() != null && !isStatic(klass);
    }

ローカルの内部クラスに対して true を返します。isMemberClass などは、この目的には機能しません。

于 2015-08-16T19:01:26.197 に答える
0

このjava.lang.Class.getEnclosingClass()メソッドは、基になるクラスのすぐ外側のクラスを返します。このクラスが最上位クラスの場合、このメソッドは null を返します。

次の例は、java.lang.Class.getEnclosingClass() メソッドの使用法を示しています。

import java.lang.*;

public class ClassDemo {
   // constructor
   public ClassDemo() {

      // class Outer as inner class for class ClassDemo
      class Outer {

         public void show() {
            // inner class of Class Outer
            class Inner {

               public void show() {
                  System.out.print(getClass().getName() + " inner in...");
                  System.out.println(getClass().getEnclosingClass());    
               }
            }
            System.out.print(getClass().getName() + " inner in...");
            System.out.println(getClass().getEnclosingClass());

            // inner class show() function
            Inner i = new Inner();
            i.show();
         }
      }

      // outer class show() function
      Outer o = new Outer();
      o.show();
   }

   public static void main(String[] args) {
     ClassDemo cls = new ClassDemo();
   }
}

出力

ClassDemo$1Outer 内部イン... クラス ClassDemo

ClassDemo$1Outer$1Inner in... クラス ClassDemo$1Outer

于 2013-07-04T10:47:06.723 に答える