检查类类型(.class)等于其他类类型

时间:2012-01-13 12:59:13

标签: java reflection

以下代码是否有效?

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

myMethod (OtherClass.class);

如果没有,我可以检查传递的.class(Class Type)类型是否为MyClass?

感谢名单!

5 个答案:

答案 0 :(得分:47)

是的,该代码有效 - 如果这两个类已由同一个类加载器加载。如果你希望这两个类被视为相等,即使它们已被不同的类加载器加载,可能来自不同的位置,基于完全限定的名称,那么只需比较完全限定的名称

请注意,您的代码仅考虑完全匹配,但是 - 它不会提供(例如)instanceof在查看值是否参考时所做的“赋值兼容性”到一个对象,它是给定类的一个实例。为此,您需要查看Class.isAssignableFrom

答案 1 :(得分:4)

我宁愿比较规范名称是完全确定的,classType.getCanonicalName()。equals(MyClass.class.getCanonicalName())。

请注意,这可能会给匿名和内部类带来问题,如果您使用它们,可以考虑使用getName。

答案 2 :(得分: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 );

}

}

答案 3 :(得分:0)

我认为您正在寻找instanceof

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

或者你可以用

比较两个类
a.getClass() == b.getClass()

答案 4 :(得分:0)

不要使用 public Observable<Response> getBrands() { return new Observable<Response>() { @Override protected void subscribeActual(Observer<? super Response> observer) { RequestHelper.GetRequest("getbrands"); } }; } public void GetBrands(){ getBrands().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Response>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Response value) { Log.w("Reactive",value.toString()); Toast.makeText(getActivity(),"Yaaaaay request 5alas",Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { Log.w("response brands= "+e.toString(),"MyTAG"); } @Override public void onComplete() { } }); } 以上不会考虑任何泛型(所有地图都相同,所有设置都相同等)