[ https://issues.apache.org/jira/browse/OPENJPA-251?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Jonathan Feinberg updated OPENJPA-251: -------------------------------------- Attachment: weirdness.zip The enclosed demonstration program gives the output public java.lang.String weirdness.TheImplementation.getIt() public java.lang.Object weirdness.TheImplementation.getIt() on my machine, but gives the output public java.lang.String weirdness.TheImplementation.getIt() public java.lang.String weirdness.TheImplementation.getIt() on a seemingly identical machine belonging to my colleague. > 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 > Attachments: weirdness.zip > > > 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.