2017-07-26 10 views
2

現在、メソッド、パラメータなどのために宣言されている注釈のようなJavaクラスのメタ情報を表示する必要があるJavaプロジェクトに取り組んでいます。Javaリフレクションを使用してJavaクラスで使用可能なメソッド注釈を表示

I持って私のメインのクラスでは、次のクラス

Employee.java

package labsheet; 

public class Employee { 

    private String eid = "E001"; 
    String ename = "Anura"; 
    public String address = "Batticaloa"; 
    protected double salary = 60_000.00; 

    public String getEid() { 
     return eid; 
    } 
    public void setEid(String eid) { 
     this.eid = eid; 
    } 
    String getEname() { 
     return ename; 
    } 
    void setEname(String ename) { 
     this.ename = ename; 
    } 
    protected String getAddress() { 
     return address; 
    } 
    protected void setAddress(String address) { 
     this.address = address; 
    } 
    @SuppressWarnings("unused") 
    private double getSalary() { 
     return salary; 
    } 
    @SuppressWarnings("unused") 
    private void setSalary(double salary) { 
     this.salary = salary; 
    } 

    public String display(String eid, String ename, String address, double salary){ 
     System.out.println("Method invoked successfully"); 
     return eid+" , "+ename+" , "+address+" , "+salary; 
    } 


} 

Task3.javaEmployee.javaで利用可能なアノテーションを表示しようとしています。そして、私は、Java Reflectionを使ってgetSalary()メソッドとsetSalary()メソッドの詳細を@SuppressWarnings("unused")で表示しようと考えています。

私は現在、Task3.javaを次のようにコーディングしています。

Task3.java

package labsheet; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.lang.reflect.Modifier; 
import java.lang.reflect.Parameter; 

public class Task3 { 
    public static void main(String[] args) { 
     try { 
      Class<?> clazz = Class.forName("labsheet.Employee"); 
      Method[] methods = clazz.getDeclaredMethods(); 

      for(int m =0; m<methods.length;m++){ 
       System.out.println("Modifier=> "+ Modifier.toString(methods[m].getModifiers())); 
       Annotation [] annotations = methods[m].getAnnotations(); 
       System.out.println("Annotation count: "+annotations.length); 
       for(int o =0; o<annotations.length;o++){ 
        System.out.println("Annotation "+(o+1)+": "+annotations[o]); 
       } 
       System.out.print("|| Return Type=> "+ methods[m].getReturnType()); 
       System.out.print("|| Method Name=> "+ methods[m].getName()); 
       Parameter[] parameters = methods[m].getParameters(); 
       if(parameters.length != 0){ 
        System.out.print("|| Method Parameters=> "); 
        for(int u = 0; u<parameters.length;u++){ 
         if(u== parameters.length-1){ 
          System.out.print(parameters[u].getType().getSimpleName()); 
         } 
         else{ 
          System.out.print(parameters[u].getType().getSimpleName()+" "); 
         } 
        } 
       } 

       System.out.println(); 
       System.out.println(); 
      } 
      System.out.println("*******************************"); 
      executeMethod(); 
      System.out.println("*******************************"); 
      executeMethodWithDefault(); 
     } 

     catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

    } 

... 
//Methods declaration for executeMethod() and executeMethodWithDefault() 

} 

しかし、私は@SuppressWarnings("unused")注釈の詳細情報を必要とするのに対し、私は、同様にそれがgetSalary(のための注釈が存在しないと言うの出力を取得)とsetSalary()メソッドいますここに表示されます。

Modifier=> protected 
Annotation count: 0 
|| Return Type=> class java.lang.String|| Method Name=> getAddress 

Modifier=> public 
Annotation count: 0 
|| Return Type=> class java.lang.String|| Method Name=> display|| Method Parameters=> String String String double 

Modifier=> private 
Annotation count: 0 
|| Return Type=> void|| Method Name=> setSalary|| Method Parameters=> double 

Modifier=> 
Annotation count: 0 
|| Return Type=> class java.lang.String|| Method Name=> getEname 

Modifier=> protected 
Annotation count: 0 
|| Return Type=> void|| Method Name=> setAddress|| Method Parameters=> String 

Modifier=> 
Annotation count: 0 
|| Return Type=> void|| Method Name=> setEname|| Method Parameters=> String 

Modifier=> private 
Annotation count: 0 
|| Return Type=> double|| Method Name=> getSalary 

Modifier=> public 
Annotation count: 0 
|| Return Type=> class java.lang.String|| Method Name=> getEid 

Modifier=> public 
Annotation count: 0 
|| Return Type=> void|| Method Name=> setEid|| Method Parameters=> String 

出力は、この点で任意の提案は非常に理解されるであろう。

答えて

0

java.lang.SuppressWarningsクラスを見てみましょう。

@Retention(RetentionPolicy.SOURCE) 
public @interface SuppressWarnings { 
    // code... 
} 

それはSOURCE保持ポリシー(java.lang.annotation.RetentionPolicyクラスを参照してください)があります。

public enum RetentionPolicy { 
    /** 
    * Annotations are to be discarded by the compiler. 
    */ 
    SOURCE, 
    // code... 
} 

これは、実行時に、アノテーションに関する情報を取得することは不可能であることを意味しますコンパイラはそれをクラスファイルに入れません。

関連する問題