2017-10-26 27 views
0

저는 Java에 익숙하지 않고 Java Annotation에 관한 문제가 있습니다. 짧은 코드 : to "TYPE"을 설정하고 "SynCheck"클래스 위에 주석을 배치하면 코드가 올바르게 작동합니다. 최대한 빨리 @Target (소스 코드와 같이) "방법"로 변경하고 "isValid"-method 통해 주석을 배치 할 때, 그것은 NullPointerException이 원인이 나는 이유를 알아낼 수 없습니다. 코드를 살펴보십시오. (그것은 일종의 이메일 문법 검사기이다).Java 주석 : @Target (ElementType = METHOD)을 사용하면 NPE가 발생합니다.

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 = "[email protected]") 
    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

'c.getAnnotation()'은 실제로'ElementType.METHOD'가 필요한 동안'ElementType.TYPE'을 사용하여 주석을 얻으려고합니다. – yegodm

답변

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

부연 설명은 주석을 전송할 필요가 없다는 것입니다. 주석을 직접 유형으로 검색 할 수 있다는 것입니다.

+0

답변 해 주셔서 감사합니다. 하지만 이제는 또 다른 예외가 있습니다. 코드를 잘랐을 때 클래스 이름을 getMethod 또는 getMethod에 넣을 지 여부에 관계없이 예외가 있습니다. 스레드 "main"의 예외 java.lang.NoSuchMethodException : emailvalid.SynCheck.isValid() \t에서 java.lang.Class.getMethod (알 수없는 소스) \t emailvalid.Main.main (Main.java:11) – Robama

+0

예, 나는 그런 방법을 찾는 데 문제가있을 수 있습니다. getMethod 대신 getDeclaredMethod를 사용해보십시오 ... –

+0

안녕하세요. 대답 해 주셔서 감사합니다. 그러나 불행히도 문제는 지속됩니다. 스레드 "main"의 예외 java.lang.NoSuchMethodException : emailvalid.SynCheck.isValid (emailvalid.SynCheck) \t의 java.lang.Class.getDeclaredMethod (알 수없는 소스). 나는 Method [] m = c.getDeclaredMethods();를 넣으려고했다. 대신 m [0]을 인쇄 할 때 결과는 "isValid"입니다. 그러나 c.getDeclaredMethod ("isValid") 또는 c.getDeclaredMethod ("isValid", Syncheck.class)를 사용하자마자 오류는 여전히 동일합니다. 아이디어가 있습니까? 그 밖의 무엇이 잘못 될 수 있습니까? 미리 감사드립니다. – Robama