gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:45:58 24 4
gpt4 key购买 nike

问题

我正在使用 Android 和 Kotlin,我想要一个注释来检查常量 String 参数(函数或构造函数)是否与特定模式(正则表达式)匹配。我读到了Pattern Annotation ,但不确定它是否适用于我的问题以及它是否适用于 Android。

所以当我有这样的代码时

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

然后

foo("aaaab")

应该可以编译,但是

foo("bb")

不应该。

这可能吗,最好没有任何第三方库?如果是,我将如何实现这样的注释? (对不起,我不熟悉编写自己的自定义注释)

背景

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

最佳答案

在 Android 中并不像其他情况那样简单,因为您必须创建一个新项目(java 库),您可以在其中放置注释。该过程看起来像这样(未经测试)。

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

  2. 在您的 app 目录中,转到 build.gradle 并修改它以包含 sourceCompatibility 和 targetCompatibility,如下所示:

    android {
    ...
    compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
    }
    }
  3. 然后在 libbuild.gradle 文件中执行几乎相同的操作(如果在第 2 步重建后不存在)

    apply plugin: 'java-library'

    dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    }

    sourceCompatibility = "1.8"
    targetCompatibility = "1.8"
  4. lib 文件夹中,为注解创建一个新类(一个 @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;
    }
    }

关于java - 是否有用于检查字符串参数模式的android注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50856560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com