1. 程式人生 > >Class類與java反射

Class類與java反射

但是 字符 equals 有一個 完成 引用 參數 getmethod 定義

1.什麽是反射?

Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;

2.Class類對象:在類加載時創建的對象,存儲在堆中,通過這個對象可以獲取類的信息

獲取Class類對象的方法:

//1、通過對象調用 getClass() 方法來獲取,通常應用在:比如你傳過來一個 Object
//  類型的對象,而我不知道你具體是什麽類,用這種方法
  Person p1 = new Person();
  Class c1 = p1.getClass();
        
//2、直接通過 類名.class 的方式得到,該方法最為安全可靠,程序性能更高
// 這說明任何一個類都有一個隱含的靜態成員變量 class   Class c2 = Person.class; //3、通過 Class 對象的 forName() 靜態方法來獲取,用的最多, // 但可能拋出 ClassNotFoundException 異常   Class c3 = Class.forName("com.ys.reflex.Person");
//需要註意的是:一個類在 JVM 中只會有一個 Class 實例,即我們對上面獲取的 c1,c2,c3進行 equals 比較,發現都是true



3.通過 Class 類獲取成員變量、成員方法、接口、超類、構造方法等

  •   getPackage():獲取該類的存放路徑 Package對象
  •   getSuperclass():獲取繼承的類 Class對象
  •   getInterfaces():獲取接口 Class型數組
  • getName():獲得類的完整名字。 String對象
  •   getFields():獲得類的public類型的屬性。 Field型數組
  • getFields(String name):獲得類的public類型的指定屬性 Field型對象
  •   getDeclaredFields():獲得類的所有屬性。包括private 聲明的和繼承類
  •   getMethods():獲得類的public類型的方法。
  •   getDeclaredMethods():獲得類的所有方法。包括private 聲明的和繼承類
  •   getMethod(String name, Class[] parameterTypes):獲得類的特定方法,name參數指定方法的名字,parameterTypes 參數指定方法的參數類型。
  •   getConstructors():獲得類的public類型的構造方法。
  •   getConstructor(Class[] parameterTypes):獲得類的特定構造方法,parameterTypes 參數指定構造方法的參數類型。(ex:int.class)
  •   newInstance():通過類的不帶參數的構造方法創建這個類的一個對象。

4.動態操作構造器,方法,屬性

構造對象:

1.User u= (User)clazz.newInstance()//創建對象,調用了無參構造器

2.//通過構造器創建對象
Constructor<User> c = clazz.getConstructor()
c.newInstance(參數)//調用有參的構造器創建對象

反射弊端:影響性能,做訪問檢查,可以通過setAcessable(true),然後可以直接方法私有屬性及方法,不再檢查

5.操作泛型:java中的泛型是針對編譯器說的,確保數據的類型安全,和免除強制類型轉換的麻煩,但是一旦編譯完成,泛型都會擦除,

6.操作註解

拓展:

類之父:Object,所有的類不聲明繼承某一個類,默認都繼承Object類

Object類的常用方法:

  • euqals():比較兩個對象的實際內容是否相等 ==:比較兩個對象的引用,即地址是否相同
  • getClass():返回對象執行的Class實例 getClass().getname()可以獲取類的名稱,在一個類中可以直接使用這個方法,畢竟繼承了父類,就有了這個方法
  • toString():將一個對象返回為字符串形式,會返回一個字符串實例,因為toString方法是Object裏面已經有了的方法,而所有類都是繼承Object,所以“所有對象都有這個方法”, 它通常只是為了方便輸出,比如System.out.println(xx),括號裏面的“xx”如果不是String類型的話,就自動調用xx的toString()方法
  • Object類中的getClass,notify,notifyall,wait等方法不能被重寫,因為這些方法被定義為final類型

Class類與java反射