I ran into a situation recently that I managed to resolve via
some programming voodoo. As a rule, I'm uncomfortable when voodoo solutions
because I'm not sure I'll be able to resolve the situation if it crops up
again. So I was hoping someone here with a bit more experience with OGNL
could help me out.
I have a class, Mamal which has a final method getId().
I have a subclass, Cat which has a (not final) method getName()
For reasons too obscure to explain, I'm using my own reflection
virtualizer to access these fields (what follows oversimplifies, but you get
the idea. There's actually a lot of cache code and whatnot in place to speed
up method location).
Method[] me = Cat.class.getMethods();
For (int x =0; x< me.length; x++) {
Method thisMethod = me[x];
if (therightone)
thisMethod.invoke(targetObject, null);
}
Works like a champ and it uses some reflection code I've had in
my bag of tricks for years.
The problem arises when ognl decides it wants to "enhance" a
class which it appears to do by generating a synthetic wrapper class and
proxying all the method calls (this based on two minutes of looking at the
debugger not reading the doc so I might be wrong).
Before ognl "enhances" a cat,
Wrapper.get("name", cat) yields "fluffy"
Wrapper.get("id", cat) yields 50
Once ognl "enhances" a cat,
Wrapper.get("name", cat) yields "fluffy"
Wrapper.get("id", cat) yields null
Here's the voodoo: if I take mammal.getId() and change it from
public final to just plain public,
Once ognl "enhances" a cat (with a non final getId()),
Wrapper.get("name", cat) yields "fluffy"
Wrapper.get("id", cat) yields 50 <--- works now??!?
Does anyone have any insight into what's going on here? Why
should finality of the method matter?
--- Pat