2012-04-08 13 views
10

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?

+0

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. –

Respuesta

9

Algo interesante cuando se mira directamente en el atributo de nombre de la clase Method.

// This is guaranteed to be interned by the VM in the 1.4 
// reflection implementation 
private String    name; 

Por interning String puede comparar directamente la referencia.

Más sobre String.intern()

+0

Desafortunadamente, esto no es cierto para todas las máquinas virtuales de Java. Es decir. el Dalvik VM en Android no devuelve cadenas internas de Method.getName o al menos no siempre. – x4u

Cuestiones relacionadas