1 java reflection types compare
假设我们有一个接受Object类型的两个参数o1和o2并返回一个布尔值的方法.我希望这个方法只有在参数是同一个类的实例时才返回true,例如:
foo(new Integer(4),new Integer(5));
Run Code Online (Sandbox Code Playgroud)
但应该返回true:
foo(new SomeClass(), new SubtypeSomeClass());
Run Code Online (Sandbox Code Playgroud)
应该返回false并且:
foo(new Integer(3),"zoo");
Run Code Online (Sandbox Code Playgroud)
应该返回false.
我相信一种方法是比较完全限定的类名:
public boolean foo(Object o1, Object o2){
Class<? extends Object> c1 = o1.getClass();
Class<? extends Object> c2 = o2.getClass();
if(c1.getName().equals(c2.getName()){ return true;}
return false;
}
Run Code Online (Sandbox Code Playgroud)
另一个条件陈述是:
if (c1.isAssignableFrom(c2) && c2.isAssignableFrom(c1)){ return true; }
Run Code Online (Sandbox Code Playgroud)
后一种选择相当缓慢.这个问题还有其他替代方案吗?
Jon*_*eet 10
不要打扰完全限定的类名 - 只需比较类引用:
public boolean foo(Object o1, Object o2) {
return o1.getClass() == o2.getClass();
}
Run Code Online (Sandbox Code Playgroud)
类通过名称和类加载器本质上是唯一的 - 所以如果对象具有相同的类名但由不同的类加载器加载,这将返回false ,但这可能是合适的:除了名称之外,它们可以是完全不同的类!但是,如果类具有相同的名称和类加载器,则它们将具有相同的引用.
请注意,这将抛出NullPointerExceptionif if o1或o2null,但同样可能是你想要的.