Java知識點總結(反射-獲取類的資訊)

蘇生發表於2019-01-19

Java知識點總結(反射-獲取類的資訊)

@(Java知識點總結)[Java, 反射]

應用反射的API,獲取類的資訊(類的名字、屬性、方法、構造器等)


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
 
public class Test02 {
  
  // 獲取類名
  private static void getName(Class clazz){
    String name = clazz.getName();
    System.out.println(name); // com.gs.Student 類的全路徑名稱
    
    String simpleName = clazz.getSimpleName() ;
    System.out.println(simpleName); // Student 類名
  }
  
  // 獲取屬性資訊
  private static void getFields(Class clazz){
    Field[] fields = clazz.getFields() ; // 只能獲取 public 的屬性
    for (Field f : fields) {
     System.out.println(f);  // public double com.gs.Student.score
    }
    Field[] declaredFields = clazz.getDeclaredFields() ; // 獲取所有的屬性
    for (Field df : declaredFields) {
     System.out.println(df);
    }
    
    try {
     Field field = clazz.getField("score"); //根據屬性名稱獲取public 屬性
     System.out.println(field);
     
     Field declaredField = clazz.getDeclaredField("name");
     System.out.println(declaredField); //根據屬性名稱獲取 private 屬性
    } catch (NoSuchFieldException e) {
     e.printStackTrace();
    } catch (SecurityException e) {
     e.printStackTrace();
    }
  }
  
  // 獲取方法資訊
  public static void getMethod(Class clazz){
    Method[] methods = clazz.getMethods() ; //獲取所有的 public 方法,包括父類的方法
    for (Method m : methods) {
     System.out.println(m);
    }
    
    System.out.println("~~~~~~~~~~~");
    
    Method[] declaredMethods = clazz.getDeclaredMethods(); // 獲取本類宣告的所有的方法
    for (Method dm : declaredMethods) {
     System.out.println(dm);
    }
    
    try {
     Method m = clazz.getMethod("getName", null); //獲取指定名字的方法,後面的形參表示獲取方法的引數類型別
     System.out.println(m);
     
     //如果方法有參,則必須傳遞引數型別對應的 Class 物件 
     Method dm = clazz.getDeclaredMethod("setName", String.class);
     System.out.println(dm);
    } catch (NoSuchMethodException e) {
     e.printStackTrace();
    } catch (SecurityException e) {
     e.printStackTrace();
    }
  }
  
  // 獲取構造方法資訊
  public static void getConstructor(Class clazz){
    try {
     // 獲取指定名稱的構造方法
     Constructor c = clazz.getDeclaredConstructor(int.class,String.class);
     System.out.println(c);
     
     //獲取所有構造方法
     Constructor[] cs= clazz.getConstructors() ;
     for (Constructor constructor : cs) {
       System.out.println(constructor);
     }
    } catch (NoSuchMethodException e) {
     e.printStackTrace();
    } catch (SecurityException e) {
     e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    String path = "com.gs.Student";
    try {
     Class clazz = Class.forName(path);
     //getName(clazz);
     
     //getFields(clazz);
     
     //getMethod(clazz);
     
     getConstructor(clazz);
    } catch (ClassNotFoundException e) {
     e.printStackTrace();
    }
  }
}

相關文章