以下是
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,因此一个自然的问题是它是否有效通过引用(==)进行比较.虽然这个代码显然是有效的,但是它是否可以成为面向反射的框架中的错误源.你怎么看?
解决方法
当你直接看到Method类的name属性时,有一件事情是有趣的.
// This is guaranteed to be interned by the VM in the 1.4 // reflection implementation private String name;
所以通过interning String你可以直接比较参考.