java.lang.reflect.Method.equals(Object obj)中的名称比较

以下是
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你可以直接比较参考.

更多在String.intern()

dawei

【声明】:唐山站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。