openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Abe White (JIRA)" <j...@apache.org>
Subject [jira] Commented: (OPENJPA-251) org.apache.openjpa.enhance.Reflection.getDeclaredMethod() has undefined behavior, leading to VM-dependent crashes
Date Wed, 06 Jun 2007 18:19:26 GMT

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

Abe White commented on OPENJPA-251:
-----------------------------------

The original implementation used Class.getDeclaredMethod.  It was changed because this is
significantly slower than using getDeclaredMethods() and searching through them, and this
method is used a lot during deployment. 

> 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.


Mime
View raw message