public final class org.apache.lucene.util.VirtualMethod<C>
  minor version: 0
  major version: 59
  flags: flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
  this_class: org.apache.lucene.util.VirtualMethod
  super_class: java.lang.Object
{
  private static final java.util.Set<java.lang.reflect.Method> singletonSet;
    descriptor: Ljava/util/Set;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    Signature: Ljava/util/Set<Ljava/lang/reflect/Method;>;

  private final java.lang.Class<C> baseClass;
    descriptor: Ljava/lang/Class;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL
    Signature: Ljava/lang/Class<TC;>;

  private final java.lang.String method;
    descriptor: Ljava/lang/String;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private final java.lang.Class<?>[] parameters;
    descriptor: [Ljava/lang/Class;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL
    Signature: [Ljava/lang/Class<*>;

  private final java.lang.ClassValue<java.lang.Integer> distanceOfClass;
    descriptor: Ljava/lang/ClassValue;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL
    Signature: Ljava/lang/ClassValue<Ljava/lang/Integer;>;

  static void <clinit>();
    descriptor: ()V
    flags: (0x0008) ACC_STATIC
    Code:
      stack=2, locals=0, args_size=0
         0: .line 61
            new java.util.HashSet
            dup
            invokespecial java.util.HashSet.<init>:()V
            invokestatic java.util.Collections.synchronizedSet:(Ljava/util/Set;)Ljava/util/Set;
            putstatic org.apache.lucene.util.VirtualMethod.singletonSet:Ljava/util/Set;
            return
      LocalVariableTable:
        Start  End  Slot  Name  Signature

  public void <init>(java.lang.Class<C>, java.lang.String, java.lang.Class<?>[]);
    descriptor: (Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)V
    flags: (0x0081) ACC_PUBLIC, ACC_VARARGS
    Code:
      stack=5, locals=5, args_size=4
        start local 0 // org.apache.lucene.util.VirtualMethod this
        start local 1 // java.lang.Class baseClass
        start local 2 // java.lang.String method
        start local 3 // java.lang.Class[] parameters
         0: .line 79
            aload 0 /* this */
            invokespecial java.lang.Object.<init>:()V
         1: .line 66
            aload 0 /* this */
            new org.apache.lucene.util.VirtualMethod$1
            dup
            aload 0 /* this */
            invokespecial org.apache.lucene.util.VirtualMethod$1.<init>:(Lorg/apache/lucene/util/VirtualMethod;)V
            putfield org.apache.lucene.util.VirtualMethod.distanceOfClass:Ljava/lang/ClassValue;
         2: .line 80
            aload 0 /* this */
            aload 1 /* baseClass */
            putfield org.apache.lucene.util.VirtualMethod.baseClass:Ljava/lang/Class;
         3: .line 81
            aload 0 /* this */
            aload 2 /* method */
            putfield org.apache.lucene.util.VirtualMethod.method:Ljava/lang/String;
         4: .line 82
            aload 0 /* this */
            aload 3 /* parameters */
            putfield org.apache.lucene.util.VirtualMethod.parameters:[Ljava/lang/Class;
         5: .line 84
            getstatic org.apache.lucene.util.VirtualMethod.singletonSet:Ljava/util/Set;
            aload 1 /* baseClass */
            aload 2 /* method */
            aload 3 /* parameters */
            invokevirtual java.lang.Class.getDeclaredMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
            invokeinterface java.util.Set.add:(Ljava/lang/Object;)Z
            ifne 11
         6: .line 85
            new java.lang.UnsupportedOperationException
            dup
         7: .line 86
            ldc "VirtualMethod instances must be singletons and therefore assigned to static final members in the same class, they use as baseClass ctor param."
         8: .line 85
            invokespecial java.lang.UnsupportedOperationException.<init>:(Ljava/lang/String;)V
            athrow
         9: .line 89
      StackMap locals: org.apache.lucene.util.VirtualMethod java.lang.Class java.lang.String java.lang.Class[]
      StackMap stack: java.lang.NoSuchMethodException
            astore 4 /* nsme */
        start local 4 // java.lang.NoSuchMethodException nsme
        10: .line 90
            new java.lang.IllegalArgumentException
            dup
            new java.lang.StringBuilder
            dup
            aload 1 /* baseClass */
            invokevirtual java.lang.Class.getName:()Ljava/lang/String;
            invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
            invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
            ldc " has no such method: "
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            aload 4 /* nsme */
            invokevirtual java.lang.NoSuchMethodException.getMessage:()Ljava/lang/String;
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
            invokespecial java.lang.IllegalArgumentException.<init>:(Ljava/lang/String;)V
            athrow
        end local 4 // java.lang.NoSuchMethodException nsme
        11: .line 92
      StackMap locals:
      StackMap stack:
            return
        end local 3 // java.lang.Class[] parameters
        end local 2 // java.lang.String method
        end local 1 // java.lang.Class baseClass
        end local 0 // org.apache.lucene.util.VirtualMethod this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0   12     0        this  Lorg/apache/lucene/util/VirtualMethod<TC;>;
            0   12     1   baseClass  Ljava/lang/Class<TC;>;
            0   12     2      method  Ljava/lang/String;
            0   12     3  parameters  [Ljava/lang/Class;
           10   11     4        nsme  Ljava/lang/NoSuchMethodException;
      Exception table:
        from    to  target  type
           5     9       9  Class java.lang.NoSuchMethodException
    Signature: (Ljava/lang/Class<TC;>;Ljava/lang/String;[Ljava/lang/Class<*>;)V
    MethodParameters:
            Name  Flags
      baseClass   
      method      
      parameters  

  public int getImplementationDistance(java.lang.Class<? extends C>);
    descriptor: (Ljava/lang/Class;)I
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // org.apache.lucene.util.VirtualMethod this
        start local 1 // java.lang.Class subclazz
         0: .line 100
            aload 0 /* this */
            getfield org.apache.lucene.util.VirtualMethod.distanceOfClass:Ljava/lang/ClassValue;
            aload 1 /* subclazz */
            invokevirtual java.lang.ClassValue.get:(Ljava/lang/Class;)Ljava/lang/Object;
            checkcast java.lang.Integer
            invokevirtual java.lang.Integer.intValue:()I
            ireturn
        end local 1 // java.lang.Class subclazz
        end local 0 // org.apache.lucene.util.VirtualMethod this
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0    1     0      this  Lorg/apache/lucene/util/VirtualMethod<TC;>;
            0    1     1  subclazz  Ljava/lang/Class<+TC;>;
    Signature: (Ljava/lang/Class<+TC;>;)I
    MethodParameters:
          Name  Flags
      subclazz  final

  public boolean isOverriddenAsOf(java.lang.Class<? extends C>);
    descriptor: (Ljava/lang/Class;)Z
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // org.apache.lucene.util.VirtualMethod this
        start local 1 // java.lang.Class subclazz
         0: .line 111
            aload 0 /* this */
            aload 1 /* subclazz */
            invokevirtual org.apache.lucene.util.VirtualMethod.getImplementationDistance:(Ljava/lang/Class;)I
            ifle 1
            iconst_1
            ireturn
      StackMap locals:
      StackMap stack:
         1: iconst_0
            ireturn
        end local 1 // java.lang.Class subclazz
        end local 0 // org.apache.lucene.util.VirtualMethod this
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0    2     0      this  Lorg/apache/lucene/util/VirtualMethod<TC;>;
            0    2     1  subclazz  Ljava/lang/Class<+TC;>;
    Signature: (Ljava/lang/Class<+TC;>;)Z
    MethodParameters:
          Name  Flags
      subclazz  final

  int reflectImplementationDistance(java.lang.Class<?>);
    descriptor: (Ljava/lang/Class;)I
    flags: (0x0000) 
    Code:
      stack=5, locals=5, args_size=2
        start local 0 // org.apache.lucene.util.VirtualMethod this
        start local 1 // java.lang.Class subclazz
         0: .line 115
            aload 0 /* this */
            getfield org.apache.lucene.util.VirtualMethod.baseClass:Ljava/lang/Class;
            aload 1 /* subclazz */
            invokevirtual java.lang.Class.isAssignableFrom:(Ljava/lang/Class;)Z
            ifne 2
         1: .line 116
            new java.lang.IllegalArgumentException
            dup
            new java.lang.StringBuilder
            dup
            aload 1 /* subclazz */
            invokevirtual java.lang.Class.getName:()Ljava/lang/String;
            invokestatic java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
            invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
            ldc " is not a subclass of "
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            aload 0 /* this */
            getfield org.apache.lucene.util.VirtualMethod.baseClass:Ljava/lang/Class;
            invokevirtual java.lang.Class.getName:()Ljava/lang/String;
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
            invokespecial java.lang.IllegalArgumentException.<init>:(Ljava/lang/String;)V
            athrow
         2: .line 117
      StackMap locals:
      StackMap stack:
            iconst_0
            istore 2 /* overridden */
        start local 2 // boolean overridden
         3: .line 118
            iconst_0
            istore 3 /* distance */
        start local 3 // int distance
         4: .line 119
            aload 1 /* subclazz */
            astore 4 /* clazz */
        start local 4 // java.lang.Class clazz
         5: goto 13
         6: .line 121
      StackMap locals: int int java.lang.Class
      StackMap stack:
            iload 2 /* overridden */
            ifne 11
         7: .line 123
            aload 4 /* clazz */
            aload 0 /* this */
            getfield org.apache.lucene.util.VirtualMethod.method:Ljava/lang/String;
            aload 0 /* this */
            getfield org.apache.lucene.util.VirtualMethod.parameters:[Ljava/lang/Class;
            invokevirtual java.lang.Class.getDeclaredMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
            pop
         8: .line 124
            iconst_1
            istore 2 /* overridden */
         9: .line 125
            goto 11
      StackMap locals:
      StackMap stack: java.lang.NoSuchMethodException
        10: pop
        11: .line 130
      StackMap locals:
      StackMap stack:
            iload 2 /* overridden */
            ifeq 12
            iinc 3 /* distance */ 1
        12: .line 119
      StackMap locals:
      StackMap stack:
            aload 4 /* clazz */
            invokevirtual java.lang.Class.getSuperclass:()Ljava/lang/Class;
            astore 4 /* clazz */
      StackMap locals:
      StackMap stack:
        13: aload 4 /* clazz */
            aload 0 /* this */
            getfield org.apache.lucene.util.VirtualMethod.baseClass:Ljava/lang/Class;
            if_acmpeq 14
            aload 4 /* clazz */
            ifnonnull 6
        end local 4 // java.lang.Class clazz
        14: .line 132
      StackMap locals:
      StackMap stack:
            iload 3 /* distance */
            ireturn
        end local 3 // int distance
        end local 2 // boolean overridden
        end local 1 // java.lang.Class subclazz
        end local 0 // org.apache.lucene.util.VirtualMethod this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0   15     0        this  Lorg/apache/lucene/util/VirtualMethod<TC;>;
            0   15     1    subclazz  Ljava/lang/Class<*>;
            3   15     2  overridden  Z
            4   15     3    distance  I
            5   14     4       clazz  Ljava/lang/Class<*>;
      Exception table:
        from    to  target  type
           7     9      10  Class java.lang.NoSuchMethodException
    Signature: (Ljava/lang/Class<*>;)I
    MethodParameters:
          Name  Flags
      subclazz  final

  public static <C> int compareImplementationDistance(java.lang.Class<? extends C>, org.apache.lucene.util.VirtualMethod<C>, org.apache.lucene.util.VirtualMethod<C>);
    descriptor: (Ljava/lang/Class;Lorg/apache/lucene/util/VirtualMethod;Lorg/apache/lucene/util/VirtualMethod;)I
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=3, args_size=3
        start local 0 // java.lang.Class clazz
        start local 1 // org.apache.lucene.util.VirtualMethod m1
        start local 2 // org.apache.lucene.util.VirtualMethod m2
         0: .line 146
            aload 1 /* m1 */
            aload 0 /* clazz */
            invokevirtual org.apache.lucene.util.VirtualMethod.getImplementationDistance:(Ljava/lang/Class;)I
            aload 2 /* m2 */
            aload 0 /* clazz */
            invokevirtual org.apache.lucene.util.VirtualMethod.getImplementationDistance:(Ljava/lang/Class;)I
            invokestatic java.lang.Integer.compare:(II)I
            ireturn
        end local 2 // org.apache.lucene.util.VirtualMethod m2
        end local 1 // org.apache.lucene.util.VirtualMethod m1
        end local 0 // java.lang.Class clazz
      LocalVariableTable:
        Start  End  Slot   Name  Signature
            0    1     0  clazz  Ljava/lang/Class<+TC;>;
            0    1     1     m1  Lorg/apache/lucene/util/VirtualMethod<TC;>;
            0    1     2     m2  Lorg/apache/lucene/util/VirtualMethod<TC;>;
    Signature: <C:Ljava/lang/Object;>(Ljava/lang/Class<+TC;>;Lorg/apache/lucene/util/VirtualMethod<TC;>;Lorg/apache/lucene/util/VirtualMethod<TC;>;)I
    MethodParameters:
       Name  Flags
      clazz  final
      m1     final
      m2     final
}
Signature: <C:Ljava/lang/Object;>Ljava/lang/Object;
SourceFile: "VirtualMethod.java"
NestMembers:
  org.apache.lucene.util.VirtualMethod$1
InnerClasses:
  org.apache.lucene.util.VirtualMethod$1