代码之家  ›  专栏  ›  技术社区  ›  Nayantara Jeyaraj

使用java反射显示java类中可用的方法注释

  •  2
  • Nayantara Jeyaraj  · 技术社区  · 7 年前

    我有以下课程

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

    我试图显示中可用的注释 Employee.java @SuppressWarnings("unused") 使用Java反射的getSalary()和setSalary()方法的详细信息。

    任务3.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()方法也没有注释,而我需要

    输出

    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
    

    1 回复  |  直到 7 年前
        1
  •  0
  •   Vadym Pechenoha    7 年前

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

    这意味着不可能在运行时获得有关注释的信息,因为编译器不会将其放入类文件中。