org.apache.openjpa.enhance.Reflection.getDeclaredMethod() has undefined 
behavior, leading to VM-dependent crashes
-----------------------------------------------------------------------------------------------------------------

                 Key: OPENJPA-251
                 URL: https://issues.apache.org/jira/browse/OPENJPA-251
             Project: OpenJPA
          Issue Type: Bug
          Components: jpa
    Affects Versions: 1.0.0
         Environment: Sun JDK 6.01
            Reporter: Jonathan Feinberg


Given 

public interface A { Object getId(); }

@Entity
public class B implements A { 
    @Id
    public String getId() { return "foo"; } 
}

B.class.getDeclaredMethods() will include both "public java.lang.String 
B.getId()" and "public java.lang.Object B.getId()". The order in which these 
two methods appear is NOT DEFINED! Because 
org.apache.openjpa.enhance.Reflection.getDeclaredMethod()  returns the first 
matching method, and because that method might well be the abstract one 
retuning Object, OpenJPA will complain that it cannot persist an ID with a 
non-explicit strategy, and throw up.

Class.getDeclaredMethod() (note singular, not plural) is defined to return the 
method with the most specific return type under these circumstances, and should 
therefore be used. Here's my implementation of Reflection.getDeclaredMethod:

        private static Method getDeclaredMethod(Class cls, String name, Class 
param)
        {
                Class[] params = param == null ? new Class[0] : new Class[] { 
param };
                try
                {
                        return cls.getDeclaredMethod(name, params);
                }
                catch (Exception e)
                {
                        return null;
                }
        }


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

Reply via email to