diff --git a/lib/java/src/reflection/limited/Argument.java b/lib/java/src/reflection/limited/Argument.java
new file mode 100644
index 0000000..c24e07e
--- /dev/null
+++ b/lib/java/src/reflection/limited/Argument.java
@@ -0,0 +1,134 @@
+/**
+ * Autogenerated by Thrift
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ */
+package com.facebook.thrift.reflection.limited;
+
+import java.util.ArrayList;
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import com.facebook.thrift.*;
+
+import com.facebook.thrift.protocol.*;
+import com.facebook.thrift.transport.*;
+
+public class Argument implements java.io.Serializable {
+  public short key;
+  public String name;
+  public ThriftType type;
+
+  public final Isset __isset = new Isset();
+  public static final class Isset {
+    public boolean key = false;
+    public boolean name = false;
+    public boolean type = false;
+  }
+
+  public Argument() {
+  }
+
+  public Argument(
+    short key,
+    String name,
+    ThriftType type)
+  {
+    this();
+    this.key = key;
+    this.__isset.key = true;
+    this.name = name;
+    this.__isset.name = true;
+    this.type = type;
+    this.__isset.type = true;
+  }
+
+  public void read(TProtocol iprot) throws TException {
+    TField field;
+    iprot.readStructBegin();
+    while (true)
+    {
+      field = iprot.readFieldBegin();
+      if (field.type == TType.STOP) { 
+        break;
+      }
+      switch (field.id)
+      {
+        case 1:
+          if (field.type == TType.I16) {
+            this.key = iprot.readI16();
+            this.__isset.key = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 2:
+          if (field.type == TType.STRING) {
+            this.name = iprot.readString();
+            this.__isset.name = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 3:
+          if (field.type == TType.STRUCT) {
+            this.type = new ThriftType();
+            this.type.read(iprot);
+            this.__isset.type = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        default:
+          TProtocolUtil.skip(iprot, field.type);
+          break;
+      }
+      iprot.readFieldEnd();
+    }
+    iprot.readStructEnd();
+  }
+
+  public void write(TProtocol oprot) throws TException {
+    TStruct struct = new TStruct("Argument");
+    oprot.writeStructBegin(struct);
+    TField field = new TField();
+    field.name = "key";
+    field.type = TType.I16;
+    field.id = 1;
+    oprot.writeFieldBegin(field);
+    oprot.writeI16(this.key);
+    oprot.writeFieldEnd();
+    if (this.name != null) {
+      field.name = "name";
+      field.type = TType.STRING;
+      field.id = 2;
+      oprot.writeFieldBegin(field);
+      oprot.writeString(this.name);
+      oprot.writeFieldEnd();
+    }
+    if (this.type != null) {
+      field.name = "type";
+      field.type = TType.STRUCT;
+      field.id = 3;
+      oprot.writeFieldBegin(field);
+      this.type.write(oprot);
+      oprot.writeFieldEnd();
+    }
+    oprot.writeFieldStop();
+    oprot.writeStructEnd();
+  }
+
+  public String toString() {
+    StringBuilder sb = new StringBuilder("Argument(");
+    sb.append("key:");
+    sb.append(this.key);
+    sb.append(",name:");
+    sb.append(this.name);
+    sb.append(",type:");
+    sb.append(this.type.toString());
+    sb.append(")");
+    return sb.toString();
+  }
+
+}
+
diff --git a/lib/java/src/reflection/limited/Constants.java b/lib/java/src/reflection/limited/Constants.java
new file mode 100644
index 0000000..669abac
--- /dev/null
+++ b/lib/java/src/reflection/limited/Constants.java
@@ -0,0 +1,16 @@
+/**
+ * Autogenerated by Thrift
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ */
+package com.facebook.thrift.reflection.limited;
+
+import java.util.ArrayList;
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import com.facebook.thrift.*;
+
+public class Constants {
+
+}
diff --git a/lib/java/src/reflection/limited/ContainerType.java b/lib/java/src/reflection/limited/ContainerType.java
new file mode 100644
index 0000000..11d3872
--- /dev/null
+++ b/lib/java/src/reflection/limited/ContainerType.java
@@ -0,0 +1,135 @@
+/**
+ * Autogenerated by Thrift
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ */
+package com.facebook.thrift.reflection.limited;
+
+import java.util.ArrayList;
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import com.facebook.thrift.*;
+
+import com.facebook.thrift.protocol.*;
+import com.facebook.thrift.transport.*;
+
+public class ContainerType implements java.io.Serializable {
+  public int ttype;
+  public SimpleType subtype1;
+  public SimpleType subtype2;
+
+  public final Isset __isset = new Isset();
+  public static final class Isset {
+    public boolean ttype = false;
+    public boolean subtype1 = false;
+    public boolean subtype2 = false;
+  }
+
+  public ContainerType() {
+  }
+
+  public ContainerType(
+    int ttype,
+    SimpleType subtype1,
+    SimpleType subtype2)
+  {
+    this();
+    this.ttype = ttype;
+    this.__isset.ttype = true;
+    this.subtype1 = subtype1;
+    this.__isset.subtype1 = true;
+    this.subtype2 = subtype2;
+    this.__isset.subtype2 = true;
+  }
+
+  public void read(TProtocol iprot) throws TException {
+    TField field;
+    iprot.readStructBegin();
+    while (true)
+    {
+      field = iprot.readFieldBegin();
+      if (field.type == TType.STOP) { 
+        break;
+      }
+      switch (field.id)
+      {
+        case 1:
+          if (field.type == TType.I32) {
+            this.ttype = iprot.readI32();
+            this.__isset.ttype = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 2:
+          if (field.type == TType.STRUCT) {
+            this.subtype1 = new SimpleType();
+            this.subtype1.read(iprot);
+            this.__isset.subtype1 = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 3:
+          if (field.type == TType.STRUCT) {
+            this.subtype2 = new SimpleType();
+            this.subtype2.read(iprot);
+            this.__isset.subtype2 = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        default:
+          TProtocolUtil.skip(iprot, field.type);
+          break;
+      }
+      iprot.readFieldEnd();
+    }
+    iprot.readStructEnd();
+  }
+
+  public void write(TProtocol oprot) throws TException {
+    TStruct struct = new TStruct("ContainerType");
+    oprot.writeStructBegin(struct);
+    TField field = new TField();
+    field.name = "ttype";
+    field.type = TType.I32;
+    field.id = 1;
+    oprot.writeFieldBegin(field);
+    oprot.writeI32(this.ttype);
+    oprot.writeFieldEnd();
+    if (this.subtype1 != null) {
+      field.name = "subtype1";
+      field.type = TType.STRUCT;
+      field.id = 2;
+      oprot.writeFieldBegin(field);
+      this.subtype1.write(oprot);
+      oprot.writeFieldEnd();
+    }
+    if (this.subtype2 != null) {
+      field.name = "subtype2";
+      field.type = TType.STRUCT;
+      field.id = 3;
+      oprot.writeFieldBegin(field);
+      this.subtype2.write(oprot);
+      oprot.writeFieldEnd();
+    }
+    oprot.writeFieldStop();
+    oprot.writeStructEnd();
+  }
+
+  public String toString() {
+    StringBuilder sb = new StringBuilder("ContainerType(");
+    sb.append("ttype:");
+    sb.append(this.ttype);
+    sb.append(",subtype1:");
+    sb.append(this.subtype1.toString());
+    sb.append(",subtype2:");
+    sb.append(this.subtype2.toString());
+    sb.append(")");
+    return sb.toString();
+  }
+
+}
+
diff --git a/lib/java/src/reflection/limited/Method.java b/lib/java/src/reflection/limited/Method.java
new file mode 100644
index 0000000..64ba21d
--- /dev/null
+++ b/lib/java/src/reflection/limited/Method.java
@@ -0,0 +1,153 @@
+/**
+ * Autogenerated by Thrift
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ */
+package com.facebook.thrift.reflection.limited;
+
+import java.util.ArrayList;
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import com.facebook.thrift.*;
+
+import com.facebook.thrift.protocol.*;
+import com.facebook.thrift.transport.*;
+
+public class Method implements java.io.Serializable {
+  public String name;
+  public ThriftType return_type;
+  public ArrayList<Argument> arguments;
+
+  public final Isset __isset = new Isset();
+  public static final class Isset {
+    public boolean name = false;
+    public boolean return_type = false;
+    public boolean arguments = false;
+  }
+
+  public Method() {
+  }
+
+  public Method(
+    String name,
+    ThriftType return_type,
+    ArrayList<Argument> arguments)
+  {
+    this();
+    this.name = name;
+    this.__isset.name = true;
+    this.return_type = return_type;
+    this.__isset.return_type = true;
+    this.arguments = arguments;
+    this.__isset.arguments = true;
+  }
+
+  public void read(TProtocol iprot) throws TException {
+    TField field;
+    iprot.readStructBegin();
+    while (true)
+    {
+      field = iprot.readFieldBegin();
+      if (field.type == TType.STOP) { 
+        break;
+      }
+      switch (field.id)
+      {
+        case 1:
+          if (field.type == TType.STRING) {
+            this.name = iprot.readString();
+            this.__isset.name = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 2:
+          if (field.type == TType.STRUCT) {
+            this.return_type = new ThriftType();
+            this.return_type.read(iprot);
+            this.__isset.return_type = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 3:
+          if (field.type == TType.LIST) {
+            {
+              TList _list0 = iprot.readListBegin();
+              this.arguments = new ArrayList<Argument>(_list0.size);
+              for (int _i1 = 0; _i1 < _list0.size; ++_i1)
+              {
+                Argument _elem2 = new Argument();
+                _elem2 = new Argument();
+                _elem2.read(iprot);
+                this.arguments.add(_elem2);
+              }
+              iprot.readListEnd();
+            }
+            this.__isset.arguments = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        default:
+          TProtocolUtil.skip(iprot, field.type);
+          break;
+      }
+      iprot.readFieldEnd();
+    }
+    iprot.readStructEnd();
+  }
+
+  public void write(TProtocol oprot) throws TException {
+    TStruct struct = new TStruct("Method");
+    oprot.writeStructBegin(struct);
+    TField field = new TField();
+    if (this.name != null) {
+      field.name = "name";
+      field.type = TType.STRING;
+      field.id = 1;
+      oprot.writeFieldBegin(field);
+      oprot.writeString(this.name);
+      oprot.writeFieldEnd();
+    }
+    if (this.return_type != null) {
+      field.name = "return_type";
+      field.type = TType.STRUCT;
+      field.id = 2;
+      oprot.writeFieldBegin(field);
+      this.return_type.write(oprot);
+      oprot.writeFieldEnd();
+    }
+    if (this.arguments != null) {
+      field.name = "arguments";
+      field.type = TType.LIST;
+      field.id = 3;
+      oprot.writeFieldBegin(field);
+      {
+        oprot.writeListBegin(new TList(TType.STRUCT, this.arguments.size()));
+        for (Argument _iter3 : this.arguments)        {
+          _iter3.write(oprot);
+          oprot.writeListEnd();
+        }
+      }
+      oprot.writeFieldEnd();
+    }
+    oprot.writeFieldStop();
+    oprot.writeStructEnd();
+  }
+
+  public String toString() {
+    StringBuilder sb = new StringBuilder("Method(");
+    sb.append("name:");
+    sb.append(this.name);
+    sb.append(",return_type:");
+    sb.append(this.return_type.toString());
+    sb.append(",arguments:");
+    sb.append(this.arguments);
+    sb.append(")");
+    return sb.toString();
+  }
+
+}
+
diff --git a/lib/java/src/reflection/limited/Service.java b/lib/java/src/reflection/limited/Service.java
new file mode 100644
index 0000000..f3a9481
--- /dev/null
+++ b/lib/java/src/reflection/limited/Service.java
@@ -0,0 +1,150 @@
+/**
+ * Autogenerated by Thrift
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ */
+package com.facebook.thrift.reflection.limited;
+
+import java.util.ArrayList;
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import com.facebook.thrift.*;
+
+import com.facebook.thrift.protocol.*;
+import com.facebook.thrift.transport.*;
+
+public class Service implements java.io.Serializable {
+  public String name;
+  public ArrayList<Method> methods;
+  public boolean fully_reflected;
+
+  public final Isset __isset = new Isset();
+  public static final class Isset {
+    public boolean name = false;
+    public boolean methods = false;
+    public boolean fully_reflected = false;
+  }
+
+  public Service() {
+  }
+
+  public Service(
+    String name,
+    ArrayList<Method> methods,
+    boolean fully_reflected)
+  {
+    this();
+    this.name = name;
+    this.__isset.name = true;
+    this.methods = methods;
+    this.__isset.methods = true;
+    this.fully_reflected = fully_reflected;
+    this.__isset.fully_reflected = true;
+  }
+
+  public void read(TProtocol iprot) throws TException {
+    TField field;
+    iprot.readStructBegin();
+    while (true)
+    {
+      field = iprot.readFieldBegin();
+      if (field.type == TType.STOP) { 
+        break;
+      }
+      switch (field.id)
+      {
+        case 1:
+          if (field.type == TType.STRING) {
+            this.name = iprot.readString();
+            this.__isset.name = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 2:
+          if (field.type == TType.LIST) {
+            {
+              TList _list4 = iprot.readListBegin();
+              this.methods = new ArrayList<Method>(_list4.size);
+              for (int _i5 = 0; _i5 < _list4.size; ++_i5)
+              {
+                Method _elem6 = new Method();
+                _elem6 = new Method();
+                _elem6.read(iprot);
+                this.methods.add(_elem6);
+              }
+              iprot.readListEnd();
+            }
+            this.__isset.methods = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 3:
+          if (field.type == TType.BOOL) {
+            this.fully_reflected = iprot.readBool();
+            this.__isset.fully_reflected = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        default:
+          TProtocolUtil.skip(iprot, field.type);
+          break;
+      }
+      iprot.readFieldEnd();
+    }
+    iprot.readStructEnd();
+  }
+
+  public void write(TProtocol oprot) throws TException {
+    TStruct struct = new TStruct("Service");
+    oprot.writeStructBegin(struct);
+    TField field = new TField();
+    if (this.name != null) {
+      field.name = "name";
+      field.type = TType.STRING;
+      field.id = 1;
+      oprot.writeFieldBegin(field);
+      oprot.writeString(this.name);
+      oprot.writeFieldEnd();
+    }
+    if (this.methods != null) {
+      field.name = "methods";
+      field.type = TType.LIST;
+      field.id = 2;
+      oprot.writeFieldBegin(field);
+      {
+        oprot.writeListBegin(new TList(TType.STRUCT, this.methods.size()));
+        for (Method _iter7 : this.methods)        {
+          _iter7.write(oprot);
+          oprot.writeListEnd();
+        }
+      }
+      oprot.writeFieldEnd();
+    }
+    field.name = "fully_reflected";
+    field.type = TType.BOOL;
+    field.id = 3;
+    oprot.writeFieldBegin(field);
+    oprot.writeBool(this.fully_reflected);
+    oprot.writeFieldEnd();
+    oprot.writeFieldStop();
+    oprot.writeStructEnd();
+  }
+
+  public String toString() {
+    StringBuilder sb = new StringBuilder("Service(");
+    sb.append("name:");
+    sb.append(this.name);
+    sb.append(",methods:");
+    sb.append(this.methods);
+    sb.append(",fully_reflected:");
+    sb.append(this.fully_reflected);
+    sb.append(")");
+    return sb.toString();
+  }
+
+}
+
diff --git a/lib/java/src/reflection/limited/SimpleType.java b/lib/java/src/reflection/limited/SimpleType.java
new file mode 100644
index 0000000..c0feae6
--- /dev/null
+++ b/lib/java/src/reflection/limited/SimpleType.java
@@ -0,0 +1,110 @@
+/**
+ * Autogenerated by Thrift
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ */
+package com.facebook.thrift.reflection.limited;
+
+import java.util.ArrayList;
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import com.facebook.thrift.*;
+
+import com.facebook.thrift.protocol.*;
+import com.facebook.thrift.transport.*;
+
+public class SimpleType implements java.io.Serializable {
+  public int ttype;
+  public String name;
+
+  public final Isset __isset = new Isset();
+  public static final class Isset {
+    public boolean ttype = false;
+    public boolean name = false;
+  }
+
+  public SimpleType() {
+  }
+
+  public SimpleType(
+    int ttype,
+    String name)
+  {
+    this();
+    this.ttype = ttype;
+    this.__isset.ttype = true;
+    this.name = name;
+    this.__isset.name = true;
+  }
+
+  public void read(TProtocol iprot) throws TException {
+    TField field;
+    iprot.readStructBegin();
+    while (true)
+    {
+      field = iprot.readFieldBegin();
+      if (field.type == TType.STOP) { 
+        break;
+      }
+      switch (field.id)
+      {
+        case 1:
+          if (field.type == TType.I32) {
+            this.ttype = iprot.readI32();
+            this.__isset.ttype = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 2:
+          if (field.type == TType.STRING) {
+            this.name = iprot.readString();
+            this.__isset.name = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        default:
+          TProtocolUtil.skip(iprot, field.type);
+          break;
+      }
+      iprot.readFieldEnd();
+    }
+    iprot.readStructEnd();
+  }
+
+  public void write(TProtocol oprot) throws TException {
+    TStruct struct = new TStruct("SimpleType");
+    oprot.writeStructBegin(struct);
+    TField field = new TField();
+    field.name = "ttype";
+    field.type = TType.I32;
+    field.id = 1;
+    oprot.writeFieldBegin(field);
+    oprot.writeI32(this.ttype);
+    oprot.writeFieldEnd();
+    if (this.name != null) {
+      field.name = "name";
+      field.type = TType.STRING;
+      field.id = 2;
+      oprot.writeFieldBegin(field);
+      oprot.writeString(this.name);
+      oprot.writeFieldEnd();
+    }
+    oprot.writeFieldStop();
+    oprot.writeStructEnd();
+  }
+
+  public String toString() {
+    StringBuilder sb = new StringBuilder("SimpleType(");
+    sb.append("ttype:");
+    sb.append(this.ttype);
+    sb.append(",name:");
+    sb.append(this.name);
+    sb.append(")");
+    return sb.toString();
+  }
+
+}
+
diff --git a/lib/java/src/reflection/limited/TTypeTag.java b/lib/java/src/reflection/limited/TTypeTag.java
new file mode 100644
index 0000000..c9095f5
--- /dev/null
+++ b/lib/java/src/reflection/limited/TTypeTag.java
@@ -0,0 +1,24 @@
+/**
+ * Autogenerated by Thrift
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ */
+package com.facebook.thrift.reflection.limited;
+
+
+public class TTypeTag {
+  public static final int T_VOID = 1;
+  public static final int T_BOOL = 2;
+  public static final int T_BYTE = 3;
+  public static final int T_I16 = 6;
+  public static final int T_I32 = 8;
+  public static final int T_I64 = 10;
+  public static final int T_DOUBLE = 4;
+  public static final int T_STRING = 11;
+  public static final int T_STRUCT = 12;
+  public static final int T_MAP = 13;
+  public static final int T_SET = 14;
+  public static final int T_LIST = 15;
+  public static final int T_ENUM = 101;
+  public static final int T_NOT_REFLECTED = 102;
+}
diff --git a/lib/java/src/reflection/limited/ThriftType.java b/lib/java/src/reflection/limited/ThriftType.java
new file mode 100644
index 0000000..d3bb3eb
--- /dev/null
+++ b/lib/java/src/reflection/limited/ThriftType.java
@@ -0,0 +1,135 @@
+/**
+ * Autogenerated by Thrift
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ */
+package com.facebook.thrift.reflection.limited;
+
+import java.util.ArrayList;
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import com.facebook.thrift.*;
+
+import com.facebook.thrift.protocol.*;
+import com.facebook.thrift.transport.*;
+
+public class ThriftType implements java.io.Serializable {
+  public boolean is_container;
+  public SimpleType simple_type;
+  public ContainerType container_type;
+
+  public final Isset __isset = new Isset();
+  public static final class Isset {
+    public boolean is_container = false;
+    public boolean simple_type = false;
+    public boolean container_type = false;
+  }
+
+  public ThriftType() {
+  }
+
+  public ThriftType(
+    boolean is_container,
+    SimpleType simple_type,
+    ContainerType container_type)
+  {
+    this();
+    this.is_container = is_container;
+    this.__isset.is_container = true;
+    this.simple_type = simple_type;
+    this.__isset.simple_type = true;
+    this.container_type = container_type;
+    this.__isset.container_type = true;
+  }
+
+  public void read(TProtocol iprot) throws TException {
+    TField field;
+    iprot.readStructBegin();
+    while (true)
+    {
+      field = iprot.readFieldBegin();
+      if (field.type == TType.STOP) { 
+        break;
+      }
+      switch (field.id)
+      {
+        case 1:
+          if (field.type == TType.BOOL) {
+            this.is_container = iprot.readBool();
+            this.__isset.is_container = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 2:
+          if (field.type == TType.STRUCT) {
+            this.simple_type = new SimpleType();
+            this.simple_type.read(iprot);
+            this.__isset.simple_type = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        case 3:
+          if (field.type == TType.STRUCT) {
+            this.container_type = new ContainerType();
+            this.container_type.read(iprot);
+            this.__isset.container_type = true;
+          } else { 
+            TProtocolUtil.skip(iprot, field.type);
+          }
+          break;
+        default:
+          TProtocolUtil.skip(iprot, field.type);
+          break;
+      }
+      iprot.readFieldEnd();
+    }
+    iprot.readStructEnd();
+  }
+
+  public void write(TProtocol oprot) throws TException {
+    TStruct struct = new TStruct("ThriftType");
+    oprot.writeStructBegin(struct);
+    TField field = new TField();
+    field.name = "is_container";
+    field.type = TType.BOOL;
+    field.id = 1;
+    oprot.writeFieldBegin(field);
+    oprot.writeBool(this.is_container);
+    oprot.writeFieldEnd();
+    if (this.simple_type != null) {
+      field.name = "simple_type";
+      field.type = TType.STRUCT;
+      field.id = 2;
+      oprot.writeFieldBegin(field);
+      this.simple_type.write(oprot);
+      oprot.writeFieldEnd();
+    }
+    if (this.container_type != null) {
+      field.name = "container_type";
+      field.type = TType.STRUCT;
+      field.id = 3;
+      oprot.writeFieldBegin(field);
+      this.container_type.write(oprot);
+      oprot.writeFieldEnd();
+    }
+    oprot.writeFieldStop();
+    oprot.writeStructEnd();
+  }
+
+  public String toString() {
+    StringBuilder sb = new StringBuilder("ThriftType(");
+    sb.append("is_container:");
+    sb.append(this.is_container);
+    sb.append(",simple_type:");
+    sb.append(this.simple_type.toString());
+    sb.append(",container_type:");
+    sb.append(this.container_type.toString());
+    sb.append(")");
+    return sb.toString();
+  }
+
+}
+
