以下是Java 7中java.lang.reflect.Method.equals(Object obj)
的实现:
/**
* Compares this {@code Method} against the specified object. Returns
* true if the objects are the same. Two {@code Methods} are the same if
* they were declared by the same class and have the same name
* and formal parameter types and return type.
*/
public boolean equals(Object obj) {
if (obj != null && obj instanceof Method) {
Method other = (Method)obj;
if ((getDeclaringClass() == other.getDeclaringClass())
&& (getName() == other.getName())) {
if (!returnType.equals(other.getReturnType()))
return false;
/* Avoid unnecessary cloning */
Class<?>[] params1 = parameterTypes;
Class<?>[] params2 = other.parameterTypes;
if (params1.length == params2.length) {
for (int i = 0; i < params1.length; i++) {
if (params1[i] != params2[i])
return false;
}
return true;
}
}
}
return false;
}
这里最有趣的部分是方法名称的比较:getName() == other.getName()
。那些返回java.lang.String
,因此一个自然的问题是,通过引用(==
)比较它们是否有效。虽然这段代码显然有用,但问题在于它是否可能成为面向反射框架中的错误源。你觉得怎么样?
答案 0 :(得分:10)
直接查看Method类的name属性时,有一件事很有趣。
// This is guaranteed to be interned by the VM in the 1.4
// reflection implementation
private String name;
因此,通过实习String,您可以直接比较参考。
更多关于String.intern()