反射

一、類是怎麼加載到內存中的

1.類的加載:

   就是將class文件讀入內存,並創建一個class對象
   任何類在使用時系統都會創建一個class對象
2.類的加載時機:
  (1).創建類的實例
  (2).訪問類的靜態成員
  (3).通過反射創建對象
  (4).初始化某個子類
  (5).運行main方法
3.加載器:負責將.class加載到內存,並生成Class對象
  (1).BootStrap ClassLoader(根類加載器):負責java核心類的加載(jdk\jre\lib\rt.jar,API)
  (2).Extension ClassLoader(擴展類加載器): 負責JRE的擴展目錄中的jar包的加載(jdk\jre\lib\ext目錄中)
  (3).System ClassLoader(系統類加載器):負責字JVM啓動時加載來自java命令的class文件,以及classpath環境變量指定的jar包和類路徑
二、反射(reflect)
  定義:在運行過程中“動態的獲取對象的信息”和“動態的調用對象的方法”的功能就是反射
  實現:就是獲取Class對象,操作Class對象
三、獲取Class對象
  第一種:Object的getClass()方法返回Object的運行時類
  第二種:通過任意對象的class靜態屬性

  第三種:將類名作爲字符串參數傳遞給Class類的forName()方法,參數使用類的帶包路徑

[java] view plain copy
  1. package com.et.example;  
  2. public class ReflectTest {  
  3.     public static void main(String[] args) throws ClassNotFoundException {  
  4.         //對象的getClass()方法返回對象的運行時類        
  5.         Animal a = new Animal();  
  6.         Class<? extends Animal> c1 = a.getClass();  
  7.         //任意對象的class靜態屬性  
  8.         Class<? extends Animal> c2 = Animal.class;  
  9.         //類名作爲字符串參數傳遞給Class類的forName()方法,參數使用類的帶包路徑  
  10.         Class<? extends Object> c3 = Class.forName("com.et.example.Animal");  
  11.         System.out.println(c1==c2);  
  12.         System.out.println(c2==c3);  
  13.     }  
  14. }  
  15. class Animal {  
  16.     private int age;  
  17.     private String name;  
  18.     public int getAge() {  
  19.         return age;  
  20.     }  
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.     public String getName() {  
  25.         return name;  
  26.     }  
  27.     public void setName(String name) {  
  28.         this.name = name;  
  29.     }  
  30.     @Override  
  31.     public int hashCode() {  
  32.         final int prime = 31;  
  33.         int result = 1;  
  34.         result = prime * result + age;  
  35.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  36.         return result;  
  37.     }  
  38.     @Override  
  39.     public boolean equals(Object obj) {  
  40.         if (this == obj)  
  41.             return true;  
  42.         if (obj == null)  
  43.             return false;  
  44.         if (getClass() != obj.getClass())  
  45.             return false;  
  46.         Animal other = (Animal) obj;  
  47.         if (age != other.age)  
  48.             return false;  
  49.         if (name == null) {  
  50.             if (other.name != null)  
  51.                 return false;  
  52.         } else if (!name.equals(other.name))  
  53.             return false;  
  54.         return true;  
  55.     }  
  56.     @Override  
  57.     public String toString() {  
  58.         return "Animal [age=" + age + ", name=" + name + "]";  
  59.     }  
  60. }  

四、通過反射獲取類的構造方法

[java] view plain copy
  1. package com.et.example;  
  2.   
  3. import java.lang.reflect.Constructor;  
  4.   
  5. public class ReflectTest {  
  6.     public static void main(String[] args) throws Exception{  
  7.         Class<? extends Object> c = Class.forName("com.et.example.Animal");  
  8.         //可獲取訪問權限內的構造方法  
  9.         Constructor<? extends Object> cst1 = c.getConstructor(int.class,String.class);  
  10.         //可獲取類的所有構造方法  
  11.         Constructor<? extends Object> cst2 = c.getDeclaredConstructor();  
  12.         //取消對Java語言的訪問檢查  
  13.         cst2.setAccessible(true);  
  14.         Animal a1 = (Animal) cst1.newInstance(10,"小提莫");  
  15.         Animal a2 = (Animal) cst2.newInstance();  
  16.         System.out.println(a1);  
  17.         System.out.println(a2);  
  18.     }  
  19. }  
  20. class Animal {  
  21.     private int age;  
  22.     private String name;  
  23.     private Animal(){  
  24.     }  
  25.     public Animal(int age,String name) {  
  26.         this.age = age;  
  27.         this.name = name;  
  28.     }  
  29.     public int getAge() {  
  30.         return age;  
  31.     }  
  32.     public void setAge(int age) {  
  33.         this.age = age;  
  34.     }  
  35.     public String getName() {  
  36.         return name;  
  37.     }  
  38.     public void setName(String name) {  
  39.         this.name = name;  
  40.     }  
  41.     @Override  
  42.     public int hashCode() {  
  43.         final int prime = 31;  
  44.         int result = 1;  
  45.         result = prime * result + age;  
  46.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  47.         return result;  
  48.     }  
  49.     @Override  
  50.     public boolean equals(Object obj) {  
  51.         if (this == obj)  
  52.             return true;  
  53.         if (obj == null)  
  54.             return false;  
  55.         if (getClass() != obj.getClass())  
  56.             return false;  
  57.         Animal other = (Animal) obj;  
  58.         if (age != other.age)  
  59.             return false;  
  60.         if (name == null) {  
  61.             if (other.name != null)  
  62.                 return false;  
  63.         } else if (!name.equals(other.name))  
  64.             return false;  
  65.         return true;  
  66.     }  
  67.     @Override  
  68.     public String toString() {  
  69.         return "Animal [age=" + age + ", name=" + name + "]";  
  70.     }  
  71. }  

5.通過反射獲取成員變量

[java] view plain copy
  1. package com.et.example;  
  2.   
  3. import java.lang.reflect.Constructor;  
  4. import java.lang.reflect.Field;  
  5.   
  6. public class ReflectTest {  
  7.     public static void main(String[] args) throws Exception{  
  8.         Class<? extends Object> c = Class.forName("com.et.example.Animal");  
  9.         Constructor<? extends Object> cst = c.getDeclaredConstructor();  
  10.         cst.setAccessible(true);  
  11.         Animal animal = (Animal) cst.newInstance();  
  12.         Field age = c.getDeclaredField("age");  
  13.         Field name = c.getDeclaredField("name");  
  14.         age.setAccessible(true);  
  15.         name.setAccessible(true);  
  16.         age.set(animal,20);  
  17.         name.set(animal,"大提莫");  
  18.         System.out.println(animal);  
  19.     }  
  20. }  
  21. class Animal {  
  22.     private int age;  
  23.     private String name;  
  24.     private Animal(){  
  25.     }  
  26.     public Animal(int age,String name) {  
  27.         this.age = age;  
  28.         this.name = name;  
  29.     }  
  30.     public int getAge() {  
  31.         return age;  
  32.     }  
  33.     public void setAge(int age) {  
  34.         this.age = age;  
  35.     }  
  36.     public String getName() {  
  37.         return name;  
  38.     }  
  39.     public void setName(String name) {  
  40.         this.name = name;  
  41.     }  
  42.     @Override  
  43.     public int hashCode() {  
  44.         final int prime = 31;  
  45.         int result = 1;  
  46.         result = prime * result + age;  
  47.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  48.         return result;  
  49.     }  
  50.     @Override  
  51.     public boolean equals(Object obj) {  
  52.         if (this == obj)  
  53.             return true;  
  54.         if (obj == null)  
  55.             return false;  
  56.         if (getClass() != obj.getClass())  
  57.             return false;  
  58.         Animal other = (Animal) obj;  
  59.         if (age != other.age)  
  60.             return false;  
  61.         if (name == null) {  
  62.             if (other.name != null)  
  63.                 return false;  
  64.         } else if (!name.equals(other.name))  
  65.             return false;  
  66.         return true;  
  67.     }  
  68.     @Override  
  69.     public String toString() {  
  70.         return "Animal [age=" + age + ", name=" + name + "]";  
  71.     }  
  72. }  

6.通過反射獲取普通方法

[java] view plain copy
  1. package com.et.example;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. public class ReflectTest {  
  6.     public static void main(String[] args) throws Exception{  
  7.         Class<? extends Object> c = Class.forName("com.et.example.Animal");  
  8.         Method[] methods = c.getDeclaredMethods();  
  9.         for(Method method:methods) {  
  10.             //獲取方法的權限類編號  
  11.             int modifiers = method.getModifiers();  
  12.             //獲取方法的參數類型  
  13.             System.out.print(modifiers+"--");  
  14.             Class<?>[] parameterTypes=method.getParameterTypes();  
  15.             for(Class parameterType:parameterTypes){  
  16.                 System.out.print(parameterType+"--");  
  17.             }  
  18.             System.out.println(method.getName());  
  19.         }  
  20.           
  21.     }  
  22. }  
  23. class Animal {  
  24.     private int age;  
  25.     private String name;  
  26.     private Animal(){  
  27.     }  
  28.     public Animal(int age,String name) {  
  29.         this.age = age;  
  30.         this.name = name;  
  31.     }  
  32.     public int getAge() {  
  33.         return age;  
  34.     }  
  35.     public void setAge(int age) {  
  36.         this.age = age;  
  37.     }  
  38.     public String getName() {  
  39.         return name;  
  40.     }  
  41.     public void setName(String name) {  
  42.         this.name = name;  
  43.     }  
  44.     @Override  
  45.     public int hashCode() {  
  46.         final int prime = 31;  
  47.         int result = 1;  
  48.         result = prime * result + age;  
  49.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  50.         return result;  
  51.     }  
  52.     @Override  
  53.     public boolean equals(Object obj) {  
  54.         if (this == obj)  
  55.             return true;  
  56.         if (obj == null)  
  57.             return false;  
  58.         if (getClass() != obj.getClass())  
  59.             return false;  
  60.         Animal other = (Animal) obj;  
  61.         if (age != other.age)  
  62.             return false;  
  63.         if (name == null) {  
  64.             if (other.name != null)  
  65.                 return false;  
  66.         } else if (!name.equals(other.name))  
  67.             return false;  
  68.         return true;  
  69.     }  
  70.     @Override  
  71.     public String toString() {  
  72.         return "Animal [age=" + age + ", name=" + name + "]";  
  73.     }  
  74. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章