public final class com.facebook.buck.example.A<T> extends java.lang.Object
<X> X getThing(T)
@java.lang.Deprecated protected T doSomethingElse()
@java.lang.Override public java.lang.String toString()
java.util.Set<java.util.Set<java.lang.String>> someStrings
protected static final int MAGIC = 42
public A()
public com.facebook.buck.example.A.Inner getInner()
public java.lang.Runnable getThing()
public static final java.lang.Object LOCK
public static final java.lang.String VISIBLE = yo another literal 
public static final java.lang.String VISIBLE_BUT_WEIRD
public void doSomething(java.lang.String...)
public void foo(java.lang.Object...)
public void foo(java.lang.Object[], java.lang.Object...)
-----
public static class com.facebook.buck.example.A.Outer extends java.lang.Object
com.facebook.buck.example.A.Outer getOuter()
public Outer()
-----
public class com.facebook.buck.example.A.Outer.InstanceOuter extends java.lang.Object
com.facebook.buck.example.A.Outer getOuter()
public InstanceOuter()
