2017-07-26 90 views
2

我目前正在研究一個需要顯示Java類的元信息的java項目,例如已經針對方法,參數等聲明的註釋。使用Java反射顯示java類中可用的方法註釋

我有以下類

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.java我試圖顯示在Employee.java中可用的註釋。因此我打算使用Java反射來顯示方法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() 

} 

但它說,有針對的getSalary()和setSalary沒有註釋()方法爲好,而我需要的@SuppressWarnings("unused")註釋詳情我得到的輸出在這裏顯示。

輸出

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... 
} 

這意味着它是不可能得到關於註釋的信息在運行時因爲編譯器不會將它放到類文件中。