Aquí está la implementación de java.lang.reflect.Method.equals(Object obj)
como de Java 7:en 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;
}
La parte más interesante aquí es la comparación de los nombres de método: getName() == other.getName()
. Los que devuelven java.lang.String
y, por tanto, una pregunta natural es si es válido compararlos por referencias (==
). Si bien este código obviamente funciona, la pregunta es si puede ser una fuente de errores en los marcos orientados a la reflexión. ¿Qué piensas?
Tal vez el que escribió 'getName() == other.getName()' quiere comprobar si los dos 'name' referencias se refieren al mismo objeto en la memoria o no, en lugar de verificando los valores reales de la cadena. –