乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      一個例子讓你了解Java反射機制

       joy_chen 2014-11-20

      通俗地說,反射機制就是可以把一個類,類的成員(函數(shù),屬性),當(dāng)成一個對象來操作,希望讀者能理解,也就是說,類,類的成員,我們在運行的時候還可以動態(tài)地去操作他們.


      理論的東東太多也沒用,下面我們看看實踐 Demo ~



      Demo:

      1. package cn.lee.demo;  
      2.   
      3. import java.lang.reflect.Constructor;  
      4. import java.lang.reflect.Field;  
      5. import java.lang.reflect.InvocationTargetException;  
      6. import java.lang.reflect.Method;  
      7. import java.lang.reflect.Modifier;  
      8. import java.lang.reflect.TypeVariable;  
      9.   
      10. public class Main {  
      11.     /** 
      12.      * 為了看清楚Java反射部分代碼,所有異常我都最后拋出來給虛擬機處理! 
      13.      * @param args 
      14.      * @throws ClassNotFoundException 
      15.      * @throws InstantiationException 
      16.      * @throws IllegalAccessException 
      17.      * @throws InvocationTargetException  
      18.      * @throws IllegalArgumentException  
      19.      * @throws NoSuchFieldException  
      20.      * @throws SecurityException  
      21.      * @throws NoSuchMethodException  
      22.      */  
      23.     public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchFieldException, NoSuchMethodException {  
      24.         // TODO Auto-generated method stub  
      25.           
      26.         //Demo1.  通過Java反射機制得到類的包名和類名  
      27.         Demo1();  
      28.         System.out.println("===============================================");  
      29.           
      30.         //Demo2.  驗證所有的類都是Class類的實例對象  
      31.         Demo2();  
      32.         System.out.println("===============================================");  
      33.           
      34.         //Demo3.  通過Java反射機制,用Class 創(chuàng)建類對象[這也就是反射存在的意義所在],無參構(gòu)造  
      35.         Demo3();  
      36.         System.out.println("===============================================");  
      37.           
      38.         //Demo4:  通過Java反射機制得到一個類的構(gòu)造函數(shù),并實現(xiàn)構(gòu)造帶參實例對象  
      39.         Demo4();  
      40.         System.out.println("===============================================");  
      41.           
      42.         //Demo5:  通過Java反射機制操作成員變量, set 和 get  
      43.         Demo5();  
      44.         System.out.println("===============================================");  
      45.           
      46.         //Demo6: 通過Java反射機制得到類的一些屬性: 繼承的接口,父類,函數(shù)信息,成員信息,類型等  
      47.         Demo6();  
      48.         System.out.println("===============================================");  
      49.           
      50.         //Demo7: 通過Java反射機制調(diào)用類中方法  
      51.         Demo7();  
      52.         System.out.println("===============================================");  
      53.           
      54.         //Demo8: 通過Java反射機制獲得類加載器  
      55.         Demo8();  
      56.         System.out.println("===============================================");  
      57.           
      58.     }  
      59.       
      60.     /** 
      61.      * Demo1: 通過Java反射機制得到類的包名和類名 
      62.      */  
      63.     public static void Demo1()  
      64.     {  
      65.         Person person = new Person();  
      66.         System.out.println("Demo1: 包名: " + person.getClass().getPackage().getName() + ","   
      67.                 + "完整類名: " + person.getClass().getName());  
      68.     }  
      69.       
      70.     /** 
      71.      * Demo2: 驗證所有的類都是Class類的實例對象 
      72.      * @throws ClassNotFoundException  
      73.      */  
      74.     public static void Demo2() throws ClassNotFoundException  
      75.     {  
      76.         //定義兩個類型都未知的Class , 設(shè)置初值為null, 看看如何給它們賦值成Person類  
      77.         Class<?> class1 = null;  
      78.         Class<?> class2 = null;  
      79.           
      80.         //寫法1, 可能拋出 ClassNotFoundException [多用這個寫法]  
      81.         class1 = Class.forName("cn.lee.demo.Person");  
      82.         System.out.println("Demo2:(寫法1) 包名: " + class1.getPackage().getName() + ","   
      83.                 + "完整類名: " + class1.getName());  
      84.           
      85.         //寫法2  
      86.         class2 = Person.class;  
      87.         System.out.println("Demo2:(寫法2) 包名: " + class2.getPackage().getName() + ","   
      88.                 + "完整類名: " + class2.getName());  
      89.     }  
      90.       
      91.     /** 
      92.      * Demo3: 通過Java反射機制,用Class 創(chuàng)建類對象[這也就是反射存在的意義所在] 
      93.      * @throws ClassNotFoundException  
      94.      * @throws IllegalAccessException  
      95.      * @throws InstantiationException  
      96.      */  
      97.     public static void Demo3() throws ClassNotFoundException, InstantiationException, IllegalAccessException  
      98.     {  
      99.         Class<?> class1 = null;  
      100.         class1 = Class.forName("cn.lee.demo.Person");  
      101.         //由于這里不能帶參數(shù),所以你要實例化的這個類Person,一定要有無參構(gòu)造函數(shù)哈~  
      102.         Person person = (Person) class1.newInstance();  
      103.         person.setAge(20);  
      104.         person.setName("LeeFeng");  
      105.         System.out.println("Demo3: " + person.getName() + " : " + person.getAge());  
      106.     }  
      107.       
      108.     /** 
      109.      * Demo4: 通過Java反射機制得到一個類的構(gòu)造函數(shù),并實現(xiàn)創(chuàng)建帶參實例對象 
      110.      * @throws ClassNotFoundException  
      111.      * @throws InvocationTargetException  
      112.      * @throws IllegalAccessException  
      113.      * @throws InstantiationException  
      114.      * @throws IllegalArgumentException  
      115.      */  
      116.     public static void Demo4() throws ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException  
      117.     {  
      118.         Class<?> class1 = null;  
      119.         Person person1 = null;  
      120.         Person person2 = null;  
      121.           
      122.         class1 = Class.forName("cn.lee.demo.Person");  
      123.         //得到一系列構(gòu)造函數(shù)集合  
      124.         Constructor<?>[] constructors = class1.getConstructors();  
      125.           
      126.         person1 = (Person) constructors[0].newInstance();  
      127.         person1.setAge(30);  
      128.         person1.setName("leeFeng");  
      129.           
      130.         person2 = (Person) constructors[1].newInstance(20,"leeFeng");  
      131.           
      132.         System.out.println("Demo4: " + person1.getName() + " : " + person1.getAge()  
      133.                 + "  ,   " + person2.getName() + " : " + person2.getAge()  
      134.                 );  
      135.           
      136.     }  
      137.       
      138.     /** 
      139.      * Demo5: 通過Java反射機制操作成員變量, set 和 get 
      140.      *  
      141.      * @throws IllegalAccessException  
      142.      * @throws IllegalArgumentException  
      143.      * @throws NoSuchFieldException  
      144.      * @throws SecurityException  
      145.      * @throws InstantiationException  
      146.      * @throws ClassNotFoundException  
      147.      */  
      148.     public static void Demo5() throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException, InstantiationException, ClassNotFoundException  
      149.     {  
      150.         Class<?> class1 = null;  
      151.         class1 = Class.forName("cn.lee.demo.Person");  
      152.         Object obj = class1.newInstance();  
      153.           
      154.         Field personNameField = class1.getDeclaredField("name");  
      155.         personNameField.setAccessible(true);  
      156.         personNameField.set(obj, "胖虎先森");  
      157.           
      158.           
      159.         System.out.println("Demo5: 修改屬性之后得到屬性變量的值:" + personNameField.get(obj));  
      160.           
      161.     }  
      162.       
      163.   
      164.     /** 
      165.      * Demo6: 通過Java反射機制得到類的一些屬性: 繼承的接口,父類,函數(shù)信息,成員信息,類型等 
      166.      * @throws ClassNotFoundException  
      167.     public static void Demo6() throws ClassNotFoundException  
      168.     {  
      169.         Class<?> class1 = null;  
      170.         class1 = Class.forName("cn.lee.demo.SuperMan");  
      171.           
      172.         //取得父類名稱  
      173.         Class<?>  superClass = class1.getSuperclass();  
      174.         System.out.println("Demo6:  SuperMan類的父類名: " + superClass.getName());  
      175.           
      176.         System.out.println("===============================================");  
      177.           
      178.           
      179.         Field[] fields = class1.getDeclaredFields();  
      180.         for (int i = 0; i < fields.length; i++) {  
      181.             System.out.println("類中的成員: " + fields[i]);  
      182.         }  
      183.         System.out.println("===============================================");  
      184.           
      185.           
      186.         //取得類方法  
      187.         Method[] methods = class1.getDeclaredMethods();  
      188.         for (int i = 0; i < methods.length; i++) {  
      189.             System.out.println("Demo6,取得SuperMan類的方法:");  
      190.             System.out.println("函數(shù)名:" + methods[i].getName());  
      191.             System.out.println("函數(shù)返回類型:" + methods[i].getReturnType());  
      192.             System.out.println("函數(shù)訪問修飾符:" + Modifier.toString(methods[i].getModifiers()));  
      193.             System.out.println("函數(shù)代碼寫法: " + methods[i]);  
      194.         }  
      195.           
      196.         System.out.println("===============================================");  
      197.           
      198.         //取得類實現(xiàn)的接口,因為接口類也屬于Class,所以得到接口中的方法也是一樣的方法得到哈  
      199.         Class<?> interfaces[] = class1.getInterfaces();  
      200.         for (int i = 0; i < interfaces.length; i++) {  
      201.             System.out.println("實現(xiàn)的接口類名: " + interfaces[i].getName() );  
      202.         }  
      203.           
      204.     }  
      205.       
      206.     /** 
      207.      * Demo7: 通過Java反射機制調(diào)用類方法 
      208.      * @throws ClassNotFoundException  
      209.      * @throws NoSuchMethodException  
      210.      * @throws SecurityException  
      211.      * @throws InvocationTargetException  
      212.      * @throws IllegalAccessException  
      213.      * @throws IllegalArgumentException  
      214.      * @throws InstantiationException  
      215.      */  
      216.     public static void Demo7() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException  
      217.     {  
      218.         Class<?> class1 = null;  
      219.         class1 = Class.forName("cn.lee.demo.SuperMan");  
      220.           
      221.         System.out.println("Demo7: \n調(diào)用無參方法fly():");  
      222.         Method method = class1.getMethod("fly");  
      223.         method.invoke(class1.newInstance());  
      224.           
      225.         System.out.println("調(diào)用有參方法walk(int m):");  
      226.         method = class1.getMethod("walk",int.class);  
      227.         method.invoke(class1.newInstance(),100);  
      228.     }  
      229.       
      230.     /** 
      231.      * Demo8: 通過Java反射機制得到類加載器信息 
      232.      *  
      233.      * 在java中有三種類類加載器。[這段資料網(wǎng)上截取] 
      234.  
      235.         1)Bootstrap ClassLoader 此加載器采用c++編寫,一般開發(fā)中很少見。 
      236.  
      237.         2)Extension ClassLoader 用來進行擴展類的加載,一般對應(yīng)的是jre\lib\ext目錄中的類 
      238.  
      239.         3)AppClassLoader 加載classpath指定的類,是最常用的加載器。同時也是java中默認的加載器。 
      240.      *  
      241.      * @throws ClassNotFoundException  
      242.      */  
      243.     public static void Demo8() throws ClassNotFoundException  
      244.     {  
      245.         Class<?> class1 = null;  
      246.         class1 = Class.forName("cn.lee.demo.SuperMan");  
      247.         String nameString = class1.getClassLoader().getClass().getName();  
      248.           
      249.         System.out.println("Demo8: 類加載器類名: " + nameString);  
      250.     }  
      251.       
      252.       
      253.       
      254. }  
      255. /** 
      256.  *  
      257.  * @author xiaoyaomeng 
      258.  * 
      259.  */  
      260. class  Person{  
      261.     private int age;  
      262.     private String name;  
      263.     public Person(){  
      264.           
      265.     }  
      266.     public Person(int age, String name){  
      267.         this.age = age;  
      268.         this.name = name;  
      269.     }  
      270.   
      271.     public int getAge() {  
      272.         return age;  
      273.     }  
      274.     public void setAge(int age) {  
      275.         this.age = age;  
      276.     }  
      277.     public String getName() {  
      278.         return name;  
      279.     }  
      280.     public void setName(String name) {  
      281.         this.name = name;  
      282.     }  
      283. }  
      284.   
      285. class SuperMan extends Person implements ActionInterface  
      286. {  
      287.     private boolean BlueBriefs;  
      288.       
      289.     public void fly()  
      290.     {  
      291.         System.out.println("超人會飛耶~~");  
      292.     }  
      293.       
      294.     public boolean isBlueBriefs() {  
      295.         return BlueBriefs;  
      296.     }  
      297.     public void setBlueBriefs(boolean blueBriefs) {  
      298.         BlueBriefs = blueBriefs;  
      299.     }  
      300.   
      301.     @Override  
      302.     public void walk(int m) {  
      303.         // TODO Auto-generated method stub  
      304.         System.out.println("超人會走耶~~走了" + m + "米就走不動了!");  
      305.     }  
      306. }  
      307. interface ActionInterface{  
      308.     public void walk(int m);  
      309. }  




      個人覺得使用反射機制的一些地方:


      1.工廠模式:Factory類中用反射的話,添加了一個新的類之后,就不需要再修改工廠類Factory了
      2.數(shù)據(jù)庫JDBC中通過Class.forName(Driver).來獲得數(shù)據(jù)庫連接驅(qū)動
      3.分析類文件:畢竟能得到類中的方法等等
      4.訪問一些不能訪問的變量或?qū)傩裕浩平鈩e人代碼


        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多