代码之家  ›  专栏  ›  技术社区  ›  greyhairredbear

是否有android注解用于检查字符串参数的模式?

  •  6
  • greyhairredbear  · 技术社区  · 7 年前

    问题

    我正在使用android和kotlin,我希望有一个注释来检查常量 String 参数(到函数或构造函数)与某个模式(regex)匹配。我读到关于 Pattern Annotation ,但不确定它是否适用于我的问题,也不确定它是否适用于android。

    所以当我有这样的代码

    fun foo(@MatchesPattern("a*b") bar: String) = println(bar)
    

    然后

    foo("aaaab")
    

    应该编译得很好,但是

    foo("bb")
    

    不应该。

    这可能吗,最好 没有 有第三方图书馆吗?如果是,我将如何实现这样的注释?(抱歉,我不熟悉编写自己的自定义批注)

    背景

    我希望传递带有连字符分隔音节的单词作为参数,但是一个单词不应超过3个音节(即每个单词最多2个连字符)。我知道我也可以用默认参数来实现这一点,但我认为注释是实现这一点的更优雅的方法。

    1 回复  |  直到 7 年前
        1
  •  2
  •   geco17    7 年前

    它不像Android那样简单,因为你必须做一个新的项目(Java库),在那里你可以注解你的注解。这个过程看起来像这样(没有经过测试)。

    1. 使用android studio创建一个新的java库作为项目中的模块(选择项目根目录,右键单击,新建模块)。这将添加一个文件夹,例如 国际清算银行 如果不更改其默认值,则使用指定的类,例如 MyCustomAnnotationProcessor .

    2. 在你 应用程序 目录,转到 build.gradle 并将其修改为包括sourcecompatibility和targetcompatibility,如下所示:

      android {
          ...
          compileOptions {
              sourceCompatibility = JavaVersion.VERSION_1_8
              targetCompatibility = JavaVersion.VERSION_1_8
          }
      }
      
    3. 然后在你的 国际清算银行 平地 文件(如果在步骤2重新生成后不存在)

      apply plugin: 'java-library'
      
      dependencies {
          implementation fileTree(dir: 'libs', include: ['*.jar'])
      }
      
      sourceCompatibility = "1.8"
      targetCompatibility = "1.8"
      
    4. 国际清算银行 文件夹中,为批注创建一个新类(一个 @interface 像这样:

      @Retention(RetentionPolicy.SOURCE)
      @Target(ElementType.PARAMETER)
      public @interface PatternMatches {
          String value() default ".*";
      }
      
    5. 修改在步骤1中创建的注释处理器。请注意,这将扩展 javax.annotation.processing.AbstractProcessor 这只是在这里,因为我们在Java库中。

      @SupportedAnnotationTypes("your.package.PatternMatches")
      @SupportedSourceVersion(SourceVersion.RELEASE_8)
      public class MyCustomAnnotationProcessor extends AbstractProcessor {
          private ProcessingEnvironment processingEnv;
          @Override
          public synchronized void init(ProcessingEnvironment env){
              processingEnv = env;
          }
          @Override
          public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
              Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(PatternMatches.class);
              Set<VariableElement> params = ElementFilter.fieldsIn(elements);
              for (VariableElement param : params) {
                  String val = param.getConstantValue();
                  String regex = param.getAnnotation(PatternMatches.class).value();
                  if (!val.matches(regex)) {
                      processingEnv.getMessager().printMessage(
      Diagnostic.Kind.ERROR, "Regex match failed", param);
                  }
              }
              return false;
          }
      }