java編譯器的一些感悟

eBusinessMan發表於2015-07-16

    為了準備面試最近複習和深入學習了向上/下轉型,泛型,可變引數,發現,我們很多時候,這些語法特性都是在編譯器層面的:編譯器會背地裡將我們的諸如此類的語法轉化成為符合直譯器的格式,所以等到達解析器執行時已經是常規格式的機器碼。例如,泛型的話編譯器會通過擦除(erasure)的前端處理,固定上、下限等操作令我們寫的原始碼變回我們的常規程式碼;可變引數的話,編譯器背地裡就自動將匹配好的引數裝到一個陣列中,於是又變回了我們的常規程式碼。在編碼中,正式由於編譯器的這些“背地裡”的行為,我們可以發明很多很好的設計模式,例如向上轉型在工廠模式,動態代理等中起到的核心作用。

    上述的都是編譯器的層面的特性,於是,很容易聯想到:如果我們能夠繞過編譯器的話,就可以做到很多不符合語法特性的事。例如,泛型:通過反射來繞過編譯器。
舉個例子:

public class Info{

         public static void main(String[] args){

                  List<String> list_str = new ArrayList<String>();

                  list_str.add(“apple”);

                  list_str.add(“orange”);

             //list_str.add(new Object());//編譯錯誤

                  //利用反射,可以繞過編譯器,因為反射是runtime的行為而非編譯期的行為:

               try {

                    list_str.getClass().getMethod("add", Object.class).invoke(list_str, new Object());

               } catch (IllegalAccessException | IllegalArgumentException

                    | InvocationTargetException | NoSuchMethodException

                    | SecurityException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

          }      

         }

}

類似的案例還有很多。
嗚呼!其實我們很多時候都是在和編譯器在博弈而已。。。。。。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29900383/viewspace-1735710/,如需轉載,請註明出處,否則將追究法律責任。

相關文章