The annotation @proxy
marks a class as implementing members dynamically
through noSuchMethod
.
The annotation applies to any class. It is inherited by subclasses from both superclass and interfaces.
If a class is annotated with @proxy
, or it implements any class that is
annotated, then the class is considered to implement any member with regard
to static type analysis.
As such, it is not a static type warning to access any member of the object
which is not implemented by the class, or to call a method with a different
number of parameters than it is declared with.
The annotation does not change which classes the annotated class implements, and does not prevent static warnings for assigning an object to a variable with a static type not implemented by the object.
The suppression of warnings only affect static type warnings about
member access.
The runtime type of the object is unaffected.
It is not considered to implement any special interfaces,
so assigning it to a typed variable may fail in checked mode,
and testing it with the is
operator
will only return true for types it actually implements or extends.
Accessing a member which isn't implemented by the class
will cause the noSuchMethod
method to be called normally,
the @proxy
annotation merely states the intent to handle (some of) those
noSuchMethod
calls gracefully.
A class that marked as @proxy
should override the noSuchMethod
declared on Object.
The intent of the @proxy
notation is to create objects that implement a
type (or multiple types) that are not known at compile time. If the types
are known at compile time, a class can be written that implements these
types.