Replace @BlazeRule with a getMetadata() method. This lets us avoid Java Reflection, and saves ~15% of initialization time in []RuleClassProvider.create().

Before change:
Over 14 samples,
average = 976
median = 969.9

After change:
Over 14 samples,
average = 811.5
median = 813.9

--
MOS_MIGRATED_REVID=89036261
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
index a14cd53..4b7015f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
@@ -123,8 +123,6 @@
   /**
    * A base rule for all test rules.
    */
-  @BlazeRule(name = "$test_base_rule",
-      type = RuleClassType.ABSTRACT)
   public static final class TestBaseRule implements RuleDefinition {
     @Override
     public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
@@ -169,6 +167,14 @@
           .add(attr(":run_under", LABEL).cfg(DATA).value(RUN_UNDER))
           .build();
     }
+
+    @Override
+    public Metadata getMetadata() {
+      return RuleDefinition.Metadata.builder()
+          .name("$test_base_rule")
+          .type(RuleClassType.ABSTRACT)
+          .build();
+    }
   }
 
   /**
@@ -205,8 +211,6 @@
   /**
    * Common parts of rules.
    */
-  @BlazeRule(name = "$base_rule",
-      type = RuleClassType.ABSTRACT)
   public static final class BaseRule implements RuleDefinition {
     @Override
     public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
@@ -234,14 +238,19 @@
           .add(attr(":action_listener", LABEL_LIST).cfg(HOST).value(ACTION_LISTENER))
           .build();
     }
+
+    @Override
+    public Metadata getMetadata() {
+      return RuleDefinition.Metadata.builder()
+          .name("$base_rule")
+          .type(RuleClassType.ABSTRACT)
+          .build();
+    }
   }
 
   /**
    * Common ancestor class for all rules.
    */
-  @BlazeRule(name = "$rule",
-      type = RuleClassType.ABSTRACT,
-      ancestors = { BaseRule.class })
   public static final class RuleBase implements RuleDefinition {
     @Override
     public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
@@ -250,6 +259,14 @@
           .add(attr("data", LABEL_LIST).cfg(DATA).allowedFileTypes(FileTypeSet.ANY_FILE))
           .build();
     }
-  }
 
+    @Override
+    public Metadata getMetadata() {
+      return RuleDefinition.Metadata.builder()
+          .name("$rule")
+          .type(RuleClassType.ABSTRACT)
+          .ancestors(BaseRule.class)
+          .build();
+    }
+  }
 }