【问题标题】:Java Annotations: Using @Target(ElementType=METHOD) causes NPEJava 注释:使用 @Target(ElementType=METHOD) 导致 NPE
【发布时间】:2017-10-26 14:30:10
【问题描述】:

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

我做错了什么?

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

【问题讨论】:

  • 您是否发布了 c.getAnnotation() 在您实际需要 ElementType.METHOD 时尝试使用 ElementType.TYPE 获取注释?

标签: java annotations target


【解决方案1】:

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

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

仅当 InputVal 注释在 SyncCheck 类上时才有效(作为类型注释)。

当您将注解移至方法时,注解将为空,因为它不再在类中...

如果你想把它放在你需要将代码更改为的方法上:

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

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

【讨论】:

  • 感谢您的回答。但是现在还有另一个例外,当我使用您的代码被剪断时,无论我是否将类名放在 getMethod 的第二个参数中:线程“main”中的异常 java.lang.NoSuchMethodException: emailvalid.SynCheck.isValid() at java.lang.Class.getMethod(Unknown Source) at emailvalid.Main.main(Main.java:11)
  • 是的,我怀疑找到这样的方法可能存在问题。尝试使用 getDeclaredMethod 而不是 getMethod...
  • 嗨。非常感谢您的回答。但不幸的是,问题仍然存在:线程“main”中的异常 java.lang.NoSuchMethodException: emailvalid.SynCheck.isValid(emailvalid.SynCheck) at java.lang.Class.getDeclaredMethod(Unknown Source)。我试图把 Method[] m = c.getDeclaredMethods();相反,当我打印 m[0] 时,结果是“isValid”。但是一旦我使用 c.getDeclaredMethod("isValid") 或 c.getDeclaredMethod("isValid", Syncheck.class),错误仍然是完全相同的。你有什么想法,还有什么可能是错的?提前谢谢你。
  • 我现在开始工作了:getMethod() 需要另一个参数。这对我有用: Method m = c.getMethod("isValid", String.class);感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
相关资源
最近更新 更多