An {@link InvocationHandler} that forwards getter methods to a
{@link CompositeData}. If you have an interface that contains
only getter methods (such as {@code String getName()} or
{@code boolean isActive()}) then you can use this class in
conjunction with the {@link Proxy} class to produce an implementation
of the interface where each getter returns the value of the
corresponding item in a {@code CompositeData}.
For example, suppose you have an interface like this:
public interface NamedNumber {
public int getNumber();
public String getName();
}
and a {@code CompositeData} constructed like this:
CompositeData cd =
new {@link CompositeDataSupport}(
someCompositeType,
new String[] {"number", "name"},
new Object[] {5, "five"}
);
then you can construct an object implementing {@code NamedNumber}
and backed by the object {@code cd} like this:
InvocationHandler handler =
new CompositeDataInvocationHandler(cd);
NamedNumber nn = (NamedNumber)
Proxy.newProxyInstance(NamedNumber.class.getClassLoader(),
new Class[] {NamedNumber.class},
handler);
A call to {@code nn.getNumber()} will then return 5.
If the first letter of the property defined by a getter is a
capital, then this handler will look first for an item in the
{@code CompositeData} beginning with a capital, then, if that is
not found, for an item beginning with the corresponding lowercase
letter or code point. For a getter called {@code getNumber()}, the
handler will first look for an item called {@code Number}, then for
{@code number}. If the getter is called {@code getnumber()}, then
the item must be called {@code number}.
If the method given to {@link #invoke invoke} is the method
{@code boolean equals(Object)} inherited from {@code Object}, then
it will return true if and only if the argument is a {@code Proxy}
whose {@code InvocationHandler} is also a {@code
CompositeDataInvocationHandler} and whose backing {@code
CompositeData} is equal (not necessarily identical) to this
object's. If the method given to {@code invoke} is the method
{@code int hashCode()} inherited from {@code Object}, then it will
return a value that is consistent with this definition of {@code
equals}: if two objects are equal according to {@code equals}, then
they will have the same {@code hashCode}. |