1. 程式人生 > 其它 >java--反射--獲取類的結構資訊

java--反射--獲取類的結構資訊

  1. 第一組:java.lang.Class類
    1. package com.model.reflection;
      
      import java.lang.annotation.Annotation;
      import java.lang.reflect.Constructor;
      import java.lang.reflect.Field;
      import java.lang.reflect.Method;
      
      /**
       * @Description:測試類
       * @Author: 張紫韓
       * @Crete 2021/6/29 15:24
       * 演示獲取類的結構資訊
       */
      public class ReflectionDemo04 {
          
      /** * 第一組API: * 1. getName:獲取全類名 * 2. getSimpleName:獲取簡單類名 * 3. getFields:獲取所有public修飾的屬性,包含本類以及父類的 * 4. getDeclaredFields:獲取本類中所有屬性 * 5. getMethods:獲取所有public修飾的方法,包含本類以及父類的 * 6. getDeclaredMethods:獲取本類中所有方法 * 7. getConstructors:獲取所有public修飾的構造器,包含本類 * 8. getDeclaredConstructors:獲取本類中所有構造器 * 9. getPackage:以Package形式返回包資訊 * 10.getSuperClass:以Class形式返回父類資訊 * 11.getlnterfaces:以Class[1形式返回介面資訊 * 12.getAnnotations:以Annotation[]形式返回註解資訊 *
      */ public static void main(String[] args) throws ClassNotFoundException { // 1.獲取Class類物件 Class<?> aClass = Class.forName("com.model.reflection.Person"); // * 1. getName:獲取全類名 System.out.println(aClass.getName()); // * 2. getSimpleName:獲取簡單類名 System.out.println(aClass.getSimpleName());
      // * 3. getFields:獲取所有public修飾的屬性,包含本類以及父類的 Field[] fields = aClass.getFields(); for (Field field : fields) { System.out.println(field); } // * 4. getDeclaredFields:獲取本類中所有屬性 Field[] declaredFields = aClass.getDeclaredFields(); for (Field field : declaredFields) { System.out.println(field); } // * 5. getMethods:獲取所有public修飾的方法,包含本類以及父類的 Method[] methods = aClass.getMethods(); for (Method method : methods) { System.out.println(method); } // * 6. getDeclaredMethods:獲取本類中所有方法 Method[] declaredMethods = aClass.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { System.out.println(declaredMethod); } // * 7. getConstructors:獲取所有public修飾的構造器,包含本類 Constructor<?>[] constructors = aClass.getConstructors(); for (Constructor<?> constructor : constructors) { System.out.println(constructor); } // * 8. getDeclaredConstructors:獲取本類中所有構造器 Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors(); for (Constructor<?> declaredConstructor : declaredConstructors) { System.out.println(declaredConstructor); } // * 9. getPackage:以Package形式返回包資訊 Package aPackage = aClass.getPackage(); System.out.println(aPackage); // * 10.getSuperClass:以Class形式返回父類資訊 System.out.println(aClass.getSuperclass()); // * 11.getInterfaces:以Class[1]形式返回介面資訊 Class<?>[] interfaces = aClass.getInterfaces(); for (Class<?> anInterface : interfaces) { System.out.println(anInterface); } // * 12.getAnnotations:以Annotation[]形式返回註解資訊 Annotation[] annotations = aClass.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); } } } class Person{ public String name; protected int age; private double sal; public void m1(){ System.out.println("m1"); }; protected void m2(){ System.out.println("m2"); }; private void m3(){ System.out.println("m3"); }; }
  2. 第二組 java.lang.reflect.Field類
  3. 第三組

  4. 第四組:
  5. package com.model.reflection;
    
    
    import org.junit.Test;
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.lang.reflect.TypeVariable;
    
    /**
     * @Description:測試類
     * @Author: 張紫韓
     * @Crete 2021/6/29 15:24
     * 演示獲取類的結構資訊
     */
    public class ReflectionDemo04 {
        /**
         * 第一組API:
         * 1. getName:獲取全類名
         * 2. getSimpleName:獲取簡單類名
         * 3. getFields:獲取所有public修飾的屬性,包含本類以及父類的
         * 4. getDeclaredFields:獲取本類中所有屬性
         * 5. getMethods:獲取所有public修飾的方法,包含本類以及父類的
         * 6. getDeclaredMethods:獲取本類中所有方法
         * 7. getConstructors:獲取所有public修飾的構造器
         * 8. getDeclaredConstructors:獲取本類中所有構造器
         * 9. getPackage:以Package形式返回包資訊
         * 10.getSuperClass:以Class形式返回父類資訊
         * 11.getInterfaces:以Class[1形式返回介面資訊
         * 12.getAnnotations:以Annotation[]形式返回註解資訊
         * */
    
    //    1.API呼叫
        @Test
        public void test_API() throws ClassNotFoundException {
    //        1.獲取Class類物件
            Class<?> aClass = Class.forName("com.model.reflection.Person");
    //                * 1. getName:獲取全類名
            System.out.println(aClass.getName());
    //                * 2. getSimpleName:獲取簡單類名
            System.out.println(aClass.getSimpleName());
    //                * 3. getFields:獲取所有public修飾的屬性,包含本類以及父類的
            Field[] fields = aClass.getFields();
            for (Field field : fields) {
                System.out.println(field);
            }
    //                * 4. getDeclaredFields:獲取本類中所有屬性
            Field[] declaredFields = aClass.getDeclaredFields();
            for (Field field : declaredFields) {
                System.out.println(field.getName());
            }
    //                * 5. getMethods:獲取所有public修飾的方法,包含本類以及父類的
            Method[] methods = aClass.getMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
    //                * 6. getDeclaredMethods:獲取本類中所有方法
            Method[] declaredMethods = aClass.getDeclaredMethods();
            for (Method declaredMethod : declaredMethods) {
                System.out.println(declaredMethod);
            }
    //                * 7. getConstructors:獲取所有public修飾的構造器
            Constructor<?>[] constructors = aClass.getConstructors();
            for (Constructor<?> constructor : constructors) {
                System.out.println(constructor);
            }
    //                * 8. getDeclaredConstructors:獲取本類中所有構造器
            Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
            for (Constructor<?> declaredConstructor : declaredConstructors) {
                System.out.println(declaredConstructor);
            }
    //                * 9. getPackage:以Package形式返回包資訊
            Package aPackage = aClass.getPackage();
            System.out.println(aPackage);
    //                * 10.getSuperClass:以Class形式返回父類資訊
            System.out.println(aClass.getSuperclass());
    //                * 11.getInterfaces:以Class[1]形式返回介面資訊
            Class<?>[] interfaces = aClass.getInterfaces();
            for (Class<?> anInterface : interfaces) {
                System.out.println(anInterface);
            }
    //                * 12.getAnnotations:以Annotation[]形式返回註解資訊
            Annotation[] annotations = aClass.getAnnotations();
            for (Annotation annotation : annotations) {
                System.out.println(annotation);
            }
    
    
    
    
        }
    
    //    2.成員變數Field屬性
        @Test
        public void  test_Field() throws ClassNotFoundException {
    
            Class<?> aClass = Class.forName("com.model.reflection.Person");
            Field[] fields = aClass.getFields(); //獲取本類中(包括父類)所有的public修飾的成員變數
            for (Field field : fields) {
                System.out.println(field.getName()); //成員變數名
                //成員變數的訪問修飾符的值,
                //說明:預設修飾符是0,public 是1, private是2,protected是4,static是8, final是16
                System.out.println(field.getModifiers());
            }
            System.out.println("****************************");
            Field[] declaredFields = aClass.getDeclaredFields();
            for (Field declaredField : declaredFields) {
                System.out.println("成員變數的名字"+declaredField.getName()); //獲取本類中所有的成員變數
                //獲取本類中成員變數的訪問屬性,
                //有兩個修飾符修飾 ,則修飾符的值相加
                System.out.println("成員變數的訪問修飾的值"+declaredField.getModifiers());
                System.out.println("成員變數的型別"+declaredField.getType());
            }
    
    
        }
    //    3.成員方法Method屬性
        @Test
        public void test_Method() throws ClassNotFoundException {
    
            Class<?> aClass = Class.forName("com.model.reflection.Person");
            Method[] methods = aClass.getDeclaredMethods();
            for (Method method : methods) {
                System.out.println("成員方法的名字"+method.getName());
                System.out.println("成員方法的修飾符的值"+method.getModifiers());
                System.out.println("成員方法的返回值型別"+method.getReturnType());
    
                //成員方法的引數
                TypeVariable<? extends Class<?>>[] typeParameters = aClass.getTypeParameters();
                for (TypeVariable<? extends Class<?>> typeParameter : typeParameters) {
                    System.out.println(typeParameter);
                }
            }
        }
    
    //    4.構造器Constructor屬性
        @Test
        public void test_Constructor() throws ClassNotFoundException {
            Class<?> aClass = Class.forName("com.model.reflection.Person");
            Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
            for (Constructor<?> declaredConstructor : declaredConstructors) {
    
                System.out.println("構造器的全類名:"+declaredConstructor.getName());
                System.out.println("構造器的修飾符的值:"+declaredConstructor.getModifiers());
                Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();
                for (Class<?> parameterType : parameterTypes) {
                    System.out.println("構造器的引數:"+parameterType.getName());
                }
    
    
            }
        }
    
    
    }
    
    
    class Person{
        public Person() {
        }
    
        public Person(String name, int age, double sal) {
            this.name = name;
            this.age = age;
            this.sal = sal;
        }
    
        public String name;
        protected int age;
        private double sal;
        public void m1(){
            System.out.println("m1");
        };
        protected void m2(){
            System.out.println("m2");
        };
        private void m3(){
            System.out.println("m3");
        };
    
    }