Reputation: 723
Is the following code valid?
void myMethod (Class classType) {
if (classType == MyClass.class) {
// do something
}
}
myMethod (OtherClass.class);
If not is there any other approach where I can check if a passed .class (Class Type) is of type - MyClass ?
Upvotes: 52
Views: 67017
Reputation: 1431
That worked for me:
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);
}
}
Upvotes: 2
Reputation: 61
Don't use
classType.getCanonicalName().equals(MyClass.class.getCanonicalName())
the above will not consider any generics (all map are the same, all set are the same etc)
Upvotes: 0
Reputation: 5002
I think you are looking for instanceof
.
Animal a = new Tiger();
System.out.println(a instanceof Tiger); // true
System.out.println(a instanceof Animal); //true
Alternatively you could compare two classes with
a.getClass() == b.getClass()
Upvotes: 1
Reputation: 506
I'd rather compare the canonical names to be completely sure, classType.getCanonicalName().equals(MyClass.class.getCanonicalName()).
Note that this may bring issues with anonymous and inner classes, if you are using them you may consider using getName instead.
Upvotes: 5
Reputation: 1500335
Yes, that code is valid - if the two classes have been loaded by the same classloader. If you want the two classes to be treated as equal even if they've been loaded by different classloaders, possibly from different locations, based on the fully-qualified name, then just compare fully-qualified names instead.
Note that your code only considers an exact match, however - it won't provide the sort of "assignment compatibility" that (say) instanceof
does when seeing whether a value refers to an object which is an instance of a given class. For that, you'd want to look at Class.isAssignableFrom
.
Upvotes: 58