1. 程式人生 > 實用技巧 >Linux刪除檔案過程解析

Linux刪除檔案過程解析

java反射

獲取Class物件的方式

  • Class.forName("全類名"): 將位元組碼檔案載入進記憶體,返回class物件
    • 多用於配置檔案,將類名定義在配置檔案中,讀取檔案載入類
  • 類名.class:通過類名的class屬性來獲取
    • 多用於引數的傳遞
  • 物件.getClass(): 通過物件的getClass方法來獲取
    • 多用於物件的獲取位元組碼方式

      package reflect;

      public class Reflect {

      //    獲取class的三種方式
      public static void main(String[] args) throws ClassNotFoundException {
      
          //1.Class.forName("全類名"): 將位元組碼檔案載入進記憶體,返回class物件
          Class cls1 = Class.forName("reflect.Person");
          System.out.println(cls1);
      
          //2類名.class:通過類名的class屬性來獲取
          Class cls2 = Person.class;
          System.out.println(cls2);
      
          //3.物件.getClass():  通過物件的getClass方法來獲取
          Person person = new Person();
          Class cls3 = person.getClass();
          System.out.println(cls3);
      
          // 比較三個物件
          System.out.println(cls1 == cls2); //true
          System.out.println(cls1 == cls3); //true
      }
      

      }

同一個位元組碼檔案(*.class)在程式執行過程中,只會被載入一次,不論通過哪一種方式獲取的class物件都是同一個

使用class物件

  • 獲取功能
    • 獲取成員變數
      • Field[] getFields()
        • 獲取所有public修飾的成員變數
      • Field getField(String name)
      • Field[] getDeclaredFields()
      • Field getDeclaredField(String name)
    • 獲取構造方法們
      • Constructor<?>[] getConstructors()
      • Constructor getConstructor(類<?>... parameterTypes)
      • Constructor<?>[] getDeclaredConstructors()
      • Constructor getDeclaredConstructor(類<?>... parameterTypes)
    • 獲取成員方法們
      • Method[] getMethods()
      • Method getMethod(String name, 類<?>... parameterTypes)
      • Method[] getDeclaredMethods()
      • Method getDeclaredMethod(String name, 類<?>... parameterTypes)
    • 獲取類其他屬性
      • 獲取類名
        • String Name getName()
    • Field: 成員變數
      • 操作:
        • 設定值:
          • void set(Object obj, Object value);
        • 設定值:
          • get(Object obj)
        • 暴力反射
          • setAccessible(true)
    • Constructor:
      • 建立物件:
        • newInstance: 建立物件
    • Method
      • 執行方法:
        • invoke(Object obj, Object... args)
      • 獲取方法的名稱
        • getName
  • package reflect;
    
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class Reflect {
    
        //    獲取class的三種方式
        public static void main(String[] args) throws Exception {
    
            Class<?> cls1 = Class.forName("reflect.Person");
            //        - 獲取成員變數
            //                - Field[]    getFields()
            Field[] fields = cls1.getFields();
    
            for (Field field : fields) {
                System.out.println(field);
            }
    
    
            Field sex = cls1.getField("sex");
    
    
            Person person = new Person();
    
            // 獲取值
            Object value = sex.get(person);
            System.out.println(value);
    
            // 設定值
            sex.set(person, "男");
            System.out.println(person.sex);
    
    
            // 獲取所有的成員變數,不考慮成員修飾符
            Field[] declaredFields = cls1.getDeclaredFields();
            for (Field declaredField : declaredFields) {
                System.out.println(declaredField);
            }
    
    
            Field name = cls1.getDeclaredField("name");
            // 忽略訪問許可權修飾符的安全檢查--> 暴力反射
            name.setAccessible(true);
            Object o = name.get(person);
            System.out.println(o);
    
    
            // 獲取構造方法
            Constructor<?> constructor = cls1.getConstructor(String.class, int.class);
            System.out.println(constructor);
    
    
            // 建立物件
            Object ivy = constructor.newInstance("IVY", 23);
            System.out.println(ivy);
    
    
            // 獲取成員方法們
            Method[] methods = cls1.getMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
    
            // 獲取指定的方法
    
            // 空參方法獲取
            Method eat = cls1.getMethod("eat");
            eat.invoke(person);
    
            // 有參方法獲取
            Method say = cls1.getMethod("say", String.class);
            say.invoke(person, "123");
    
    
            // 獲取類名
            String name1 = cls1.getName();
            System.out.println(name1);
    
    
        }
    }