harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jim Yu (JIRA)" <j...@apache.org>
Subject [jira] Created: (HARMONY-6237) [classlib][luni] HashMap doesn't support proxy object as keys
Date Thu, 18 Jun 2009 06:20:10 GMT
[classlib][luni] HashMap doesn't support proxy object as keys
-------------------------------------------------------------

                 Key: HARMONY-6237
                 URL: https://issues.apache.org/jira/browse/HARMONY-6237
             Project: Harmony
          Issue Type: Bug
          Components: Classlib
    Affects Versions: 5.0M10
            Reporter: Jim Yu
             Fix For: 5.0M11


There is an interesting edge case in HashMap. If we use a proxy object as the key to put something
into HashMap, we will fail to retrieve the value by using that key. But RI works well for
this case. Here is a test case below to present the problem. I found the root cause of the
failure for Harmony HashMap is that proxyInstance.equals(proxyInstance) returns false which
sounds strange but appears work correctly as both Harmony and RI behave so. I suspect RI has
made some special approaches to match the key when the key is a proxy object. So I would be
inclined to follow RI's behavior in this case. 

public interface MockInterface {
    public String mockMethod();
}

public class MockClass implements MockInterface {
    public String mockMethod() {
        return "This is a mock class.";
    }
}

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;

public class TestProxy implements InvocationHandler {

    Object obj;

    public TestProxy(Object o) {
        obj = o;
    }

    public Object invoke(Object proxy, Method m, Object[] args)
            throws Throwable {

        Object result = null;

        try {

            result = m.invoke(obj, args);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
        return result;
    }

    public static void main(String[] argv) throws Exception {

        MockInterface proxyInstance = (MockInterface) Proxy.newProxyInstance(
                MockInterface.class.getClassLoader(),
                new Class[] { MockInterface.class }, new TestProxy(
                        new MockClass()));

        Map hm = new HashMap();

        hm.put(proxyInstance, "Value");

        Object o = hm.get(proxyInstance);

        System.out.println("Value got for proxy object key:" + o);

        System.out.println(proxyInstance.equals(proxyInstance));

    }
}

Output
Harmony:
Value got for proxy object key:null
false

RI:
Value got for proxy object key:Value
false

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message