I just verified that the static approach will work. See attached.
-G



On Jun 9, 2009, at 1:00 PM, Greg Brown wrote:

You are correct - it doesn't work. The Javadoc for Method#invoke() says this:

"If the underlying method is an instance method, it is invoked using dynamic method lookup as documented in The Java Language Specification, Second Edition, section 15.12.4.4; in particular, overriding based on the runtime type of the target object will occur."

However, maybe it could be static:

public static __bind(T t, WTKXSerializer serializer) { ... }

where T is the type of the class that contains an @Bind annotation (not a generic - the actual type). It could be Object, but there's no need for it to be since we know what type it is. Since it is a static method of the class, it will have access to the class's internal variables, but won't be overridden by a subclass.


On Jun 9, 2009, at 12:33 PM, Noel Grandin wrote:

Unfortunately in Java, you can't invoke a specific subclass version of
an overridden method.

That means that either
(a) you have to trust that each method correctly invokes super.__bind
(b) we need a more complex scheme.

Something like having each class X define a method
public void __bind(X myself, WTKXSerializer serializer)
And then WTKXSerializer#bind() could walk up the class hierarchy,
and use reflection to find the __bind methods and invoke them.

But maybe someone can come up with a scheme that involves less magic?
(I like reflection, but it's best used in small doses).


On Tue, Jun 9, 2009 at 17:14, Greg Brown<[email protected]> wrote:
I think this will actually work, and won't require too many changes. The bind processor can add the Bindable interface to every class that uses an
@Bind annotation. The interface would contain a single method:

public void __bind(WTKXSerializer serializer);

WTKXSerializer#bind() would check to see if the bound object implemented Bindable; if so, it would walk up the object's class hierarchy looking for subclasses that implement Bindable. When found, it would invoke the specific
__bind() method defined by the subclass.

Sound right?



Reply via email to