我是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();
}
我做错了什么?
任何帮助表示赞赏。 谢谢。
答案 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);
附注是您不必投射注释,您可以直接将其检索到它的类型。