2012-04-08 29 views
10

Đây là việc thực hiện các java.lang.reflect.Method.equals(Object obj) như của Java 7:Tên so sánh trong 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; 
} 

Phần thú vị nhất ở đây là so sánh các tên phương pháp: getName() == other.getName(). Những trở lại java.lang.String và do đó một câu hỏi tự nhiên là liệu nó có hợp lệ để so sánh chúng với tham chiếu (==). Mặc dù mã này rõ ràng là hoạt động, câu hỏi đặt ra là liệu nó có thể là một nguồn của các lỗi trong các khung định hướng phản chiếu hay không. Bạn nghĩ sao?

+0

Có lẽ một trong những người đã viết 'getName() == other.getName() 'muốn kiểm tra xem hai' name' tài liệu tham khảo đề cập đến cùng một đối tượng trong bộ nhớ hay không, chứ không phải là kiểm tra các giá trị chuỗi thực tế. –

Trả lời

9

Một điều thú vị khi bạn nhìn trực tiếp vào thuộc tính tên của lớp Phương thức.

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

Vì vậy, bằng cách thực tập, bạn có thể so sánh trực tiếp tham chiếu.

Thông tin thêm về String.intern()

+0

Thật không may điều này là không đúng đối với tất cả các máy ảo Java. I E. máy ảo Dalvik trên Android không trả về các chuỗi nội bộ từ Method.getName hoặc ít nhất không phải lúc nào. – x4u