Jeremiah created THRIFT-2531:
--------------------------------
Summary: Generate Interface for thrift objects
Key: THRIFT-2531
URL: https://issues.apache.org/jira/browse/THRIFT-2531
Project: Thrift
Issue Type: Improvement
Components: Java - Compiler
Affects Versions: 0.9.1, 0.7
Environment: Java 6
Reporter: Jeremiah
Currently, generated thrift objects implement the TBase interface, which
defines generic methods applicable to all generated objects (read/write from
protocol objects, retrieving a field value by specifying the field ID).
My request is for the generation of an interface for each thrift object, which
in turn implement that interface. It looks like what is already done for thrift
services:
{code}
public class MyType implements org.apache.thrift.TBase<MyType, MyType._Fields>,
MyType.IFace, ... {
public interface IFace {
...
}
...
}
{code}
The interface should contain all getters and setters for the fields specified
in the thrift definition (e.g. {{getXXX()}}, {{setXXX(...)}}, {{isXXXSet()}},
etc.).
All those methods are already generated for thrift objects, they just should
also be declared in an interface for each object.
*Rationale*
This will allow to use Java's dynamic proxies to decorate and manipulate thrift
objects.
Java's reflective framework ({{Proxy}} and {{InvocationHandler}}) work with
interfaces and are not able to manage classes as proxyed types. E.g. it is not
possible to cast a proxy for an instance of {{MyType}} to a variable of type
{{MyType}} if {{MyType}} is not an interface.
Thus, if the class {{MyType}} defines getters and setters, the user will not be
able to use them behind a dynamic proxy as casting the proxy to {{MyType}} will
throw a {{ClassCastException}}.
{code}
public interface MyIFace { ... }
public class MyClass implements MyIFace { ... }
{code}
{code}
// proxify(MyClass instance) is implemented somewhere
// The proxy has to declare proxying for an interface (MyIFace) or it won't
even compile.
MyIFace f = (MyIFace) proxify(new MyClass()) // OK
MyClass x = (MyClass) proxify(new MyClass()) // Throws ClassCastException
{code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)