2012-01-13 4 views
27

Имеет ли значение следующий код?Проверка типа класса (.class) равна некоторому классу другого типа

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

myMethod (OtherClass.class); 

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

Thanx!

+0

Не забудьте принять ответы или прокомментировать, если ответы не соответствуют вашим требованиям Fahim. Ответ Джона безупречен (как обычно). –

ответ

43

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

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

3

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

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

2

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

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

} 

} 
1

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

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

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

a.getClass() == b.getClass() 
+4

'instanceof' возвращает' true' также для подклассов, что, вероятно, не соответствует OP – user11153

+1

Вопрос был в сравнении фактических классов, а не сравнении объектов. –

0

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

Смежные вопросы