2017-10-26 12 views
0

私はJavaに新しいので、Java注釈に関する問題があります。 ショート:コードを正しく設定すると、@ターゲットから"TYPE"となり、アノテーションを "SynCheck"クラスの上に配置します。できるだけ早く私は@Target(ソースコードに見られるように)「METHOD」に変更し、「は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になりません

...

あなたはあなたがあなたのコードを変更する必要がある方法でそれを配置する場合:

注釈をキャストする必要がないということは、注釈を直接そのタイプに取り込むことができることです。

+0

あなたの答えをありがとう。しかし、今度はもう1つの例外があります。あなたのコードをスニッフィングして、getMethodの2番目の引数にクラス名を入れるかどうかにかかわらず、例外があります:スレッド "main"の例外java.lang.NoSuchMethodException:emailvalid.SynCheck.isValid() \t java.lang.Class.getMethod(Unknown Source) \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(Unknown Source))。私は、メソッド[] m = c.getDeclaredMethods();を入れようとしました。代わりにm [0]を出力したときの結果は "isValid"でした。しかし、私はc.getDeclaredMethod( "isValid")またはc.getDeclaredMethod( "isValid"、Syncheck.class)を使用するとすぐに、エラーはまったく同じです。それ以外に何が間違っているのでしょうか?前もって感謝します。 – Robama

関連する問題