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

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

  •  0
  • Robama  · 技术社区  · 7 年前

    我是Java新手,在Java注释方面有一个问题。 @目标 并将注释放置在“SynCheck”类的上方。我一换衣服 @目标 “方法” 空指针异常 我不知道为什么。

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

    同步检查。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;
                }
        }   
    }
    

    输入值。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 回复  |  直到 7 年前
        1
  •  1
  •   Michael Wiles    7 年前

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

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

    旁注是,您不必强制转换注释,可以直接将其检索到其类型中。