Java注释:使用@Target(ElementType = METHOD)会导致NPE

时间:2017-10-26 14:30:11

标签: java annotations target

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

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();
}

我做错了什么?

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

1 个答案:

答案 0 :(得分:1)

您的代码不会在方法上查找注释。只在课堂上。

 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);

附注是您不必投射注释,您可以直接将其检索到它的类型。