[ 
https://issues.apache.org/jira/browse/OPENJPA-251?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12501994
 ] 

Patrick Linskey commented on OPENJPA-251:
-----------------------------------------

>From a fix standpoint, it'd be nice to come up with a helper method that 
>replaces the functionality of getDeclaredMethods(), but only lists the 
>most-specific of duplicate covariant signatures 
>(getMostSpecificDeclaredMethods() or something) so that we can use it 
>throughout the codebase without duplication of the looping logic.

> 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: 0.9.7
>         Environment: Sun JDK 6.01
>            Reporter: Jonathan Feinberg
>             Fix For: 1.0.0
>
>         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.

Reply via email to