2012-01-13 10 views
27

次のコードは有効ですか?クラスタイプ(.class)のチェックは他のクラスタイプと同じです

void myMethod (Class classType) { 
    if (classType == MyClass.class) { 
     // do something 
    } 
} 

myMethod (OtherClass.class); 

渡された.classファイル(クラスタイプ)は型である場合、私がチェックすることができ、他のアプローチが存在しない場合 - MyClassのは?

Thanx!

+0

回答が要件を満たしていない場合は、回答を受け入れるかコメントしてください。ジョンの答えは完璧です(いつものように)。 –

答えて

43

はい、このコードは有効です。つまり、2つのクラスが同じクラスローダーによって読み込まれている場合です。 異なるクラスローダーによってロードされていても、2つのクラスを等価として扱いたい場合は、完全修飾名に基づいて別の場所から別の場所にコピーしてください。あなたのコードだけ正確一致、しかし考えて

注 - それは「代入互換性」のようなものを提供しないことを(例えば)値がのインスタンスであるオブジェクトを参照するかどうかを見るとinstanceofはありません与えられたクラス。そのためには、Class.isAssignableFromを見たいと思うでしょう。

3

classType.getCanonicalName()。equals(MyClass.class.getCanonicalName())を完全に確認するために、正規名を比較したいと思います。

これは、匿名クラスと内部クラスで問題が発生する可能性があることに注意してください。使用している場合は、代わりにgetNameを使用することを検討してください。私はあなたがinstanceofを探していると思う私

public class Test 
{ 

void myMethod (Class classType) { 
    System.out.println(classType.isAssignableFrom(Test.class)); 
} 

public static void main(String[] args) { 
    Test t = new Test(); 
    t.myMethod(String.class); 

} 

} 
2

Animal a = new Tiger(); 
System.out.println(a instanceof Tiger); // true 
System.out.println(a instanceof Animal); //true 

別の方法としては、上記の classType.getCanonicalName().equals(MyClass.class.getCanonicalName()) を使用しないでください

a.getClass() == b.getClass() 
1

のために働い

+4

'instanceof'は、サブクラスに対しても' true'を返します。これはおそらくOPが望んでいないものです – user11153

+1

質問は、オブジェクトを比較するのではなく、実際のクラスを比較することでした。 –

0

で2つのクラスを比較することができ、任意のジェネリックを考慮しています(すべてのマップが同じで、すべてのセットが同じなどです)

関連する問題