Проверка типа класса (.class) равна некоторому другому типу класса - PullRequest
33 голосов
/ 13 января 2012

Действителен ли следующий код?

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

myMethod (OtherClass.class);

Если нет, есть ли другой подход, где я могу проверить, имеет ли переданный .class (тип класса) тип - MyClass?

Thanx!

Ответы [ 5 ]

47 голосов
/ 13 января 2012

Да, этот код действителен - если два класса были загружены одним и тем же загрузчиком классов. Если вы хотите, чтобы два класса рассматривались как равные, даже если они были загружены различными загрузчиками классов, возможно, из разных мест на основе полностью определенного имени, просто сравните вместо этого полностью определенные имена.

Обратите внимание, что ваш код учитывает только точное совпадение, однако - он не обеспечит своего рода "совместимость присваивания", которая (скажем) instanceof делает, когда видит, относится ли значение к объекту который является экземпляром данного класса. Для этого вы хотели бы посмотреть на Class.isAssignableFrom.

4 голосов
/ 13 января 2012

Я бы лучше сравнил канонические имена, чтобы быть полностью уверенным, classType.getCanonicalName (). Equals (MyClass.class.getCanonicalName ()).

Обратите внимание, что это может вызвать проблемы с анонимными и внутренними классами, если вы используете их, вы можете вместо этого использовать getName.

2 голосов
/ 13 января 2012

Это сработало для меня

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 );

}

}
0 голосов
/ 15 декабря 2017

не использовать classType.getCanonicalName().equals(MyClass.class.getCanonicalName()) вышеупомянутое не будет рассматривать никаких обобщений (все карты одинаковы, все наборы одинаковы и т. д.)

0 голосов
/ 13 января 2012

Я думаю, что вы ищете instanceof.

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

В качестве альтернативы вы можете сравнить два класса с

a.getClass() == b.getClass()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...