Java注释: Using @Target(ElementType=METHOD) causes NPE

标签 java annotations target

我是 Java 新手,有一个关于 Java 注释的问题。 简而言之:当我将 @Target 设置为 "TYPE" 并将注释放置在“SynCheck”类上方时,代码工作得很好。一旦我将@Target更改为“METHOD”(如源代码中所示)并将注释放在“isValid”方法上,它就会导致>NullPointerException,我不明白为什么。 请看一下代码。 (它是一种电子邮件语法 validator )。

Main.java:

package emailvalid;
import java.lang.annotation.Annotation;

public class Main {

    public static void main(String[] args) throws Exception {

        SynCheck validate = new SynCheck();

        Class<? extends SynCheck> c = validate.getClass();
        Annotation an = c.getAnnotation(InputVal.class);
        InputVal s = (InputVal)an;

        System.out.println(s.input());
        System.out.println("Syntax: " + SynCheck.isValid(s.input()));

    }
}

SynCheck.java:

package emailvalid;
import java.util.regex.Pattern;


public class SynCheck {
    @InputVal(input = "example@domain.org")
    public static boolean isValid(String checkAddr)
    {
        final Pattern regexevalpat = Pattern.compile(
        "^((?=.{1,63}$)[a-zA-Z0-9]+[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\’\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]{0,})@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9-]+$");
        if (!regexevalpat.matcher(checkAddr).matches()) {
                return false;
            } else {
                return true;
            }
    }   
}

InputVal.java:

package emailvalid;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InputVal {

    String input();
}

我做错了什么?

任何帮助表示赞赏。 谢谢。

最佳答案

您的代码不会查找方法上的注释。仅在类里面。

 SynCheck validate = new SynCheck();
 Class<? extends SynCheck> c = validate.getClass();
 Annotation an = c.getAnnotation(InputVal.class);
 InputVal s = (InputVal)an;

只有当 InputVal 注释位于 SyncCheck 类上(作为类型注释)时,这才有效。

当您将注释移至方法时,注释将为 null,因为它不再位于类中...

如果您想将其放在需要将代码更改为的方法上:

 Class<? extends SynCheck> c = validate.getClass();
 Method m = c.getMethod("isValid");
 InputVal s = m.getAnnotation(InputVal.class);

附带的注释是,您不必强制转换注释,您可以直接将其检索到其本身的类型。

关于Java注释: Using @Target(ElementType=METHOD) causes NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46957047/

相关文章:

java - Struts2 不适用于带注释的操作

javascript - 修改:target in javascript

cursor - 如何将光标移动到Dart中的元素?

java - Google AppEngine Search API 仅返回 20 个结果,尽管还有更多结果

java - 如何使 if/else 语句读取第一个匹配的关键字? ( java )

java - 如何在 JPA 域模型中实现状态设计模式

java - 了解同步的行为

jpa - 通过未标记为级联 PERSIST 的关系找到了新对象

java - 在步骤中访问 JBehave Examples 表数据

algorithm - 从预测算法中获取两个目标值