Another reflection bug; compatibility results
Stuart Ballard
kaffe@rufus.w3.org
Thu, 15 Jun 2000 14:00:41 -0400
Godmar Back wrote:
>
> Okay, try it again now.
>
> We now also search superinterfaces if you invoke Class.getMethod() on
> an interface class.
Excellent. Kaffe now gives exactly 0 "M" (the NoSuchMethodException) and
only about 7 or 8 "!" (the non-equality) on the whole of its class
libraries. As you point out, it's probably impossible to avoid all "!"s.
Thanks for explaining why I was getting these in the JDK :)
> Also, since there no ordering of superinterfaces, there's also no notion
> of "overriding" - hence both Kaffe and JDK report methods in all
> superinterfaces. However, getMethod will stop looking at the first
> match. This leads (in both JDK and Kaffe) to what you call "Non-equality"
> in your test.
Hmm, okay. That doesn't seem to be a problem for what I'm doing. Since I
only want each distinct method reported once, and I don't care which
class it's defined on (I don't even report that information), I'll
continue to use the inequality test as a way to ensure I don't see any
methods twice. It is safe to assume that two calls to getMethod() with
the same arguments *in the same run of Kaffe* (and without the
possibility of any classes being gc'd) will always return the same
method, right?
> However, I believe that none of this should have an adverse impact
> on the interface compatibility checking you're doing. For instance,
> you should be able to easily figure out what's what by checking whether
> a class inherits a method or not - one way to find that out is to
> check whether getClass().getMethod().getClass() != getClass().
Actually, I don't even care whether it's inherited or not - I just
didn't want the same method showing up twice. I only bothered to put the
check in at all as a workaround for the fact that Kaffe was reporting
overridden methods all the way up, and I wanted to make sure I only got
the "definitive" one. I'm glad I did or I'd never have realized that the
same method could *legitimately* show up twice if it's inherited from
two superinterfaces.
Thanks for your time :)
Stuart.