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