日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解Java泛型擦除

泛型信息只存在于代碼編譯階段,但是在java的運行期(已經(jīng)生成字節(jié)碼文件后)與泛型相關(guān)的信息會被擦除掉,專業(yè)術(shù)語叫做類型擦除。

今天我們來講解泛型中另一個重要知識點——泛型擦除!

十分鐘理解Java泛型擦除十分鐘理解Java泛型擦除

泛型擦除概念

泛型信息只存在于代碼編譯階段,但是在java的運行期(已經(jīng)生成字節(jié)碼文件后)與泛型相關(guān)的信息會被擦除掉,專業(yè)術(shù)語叫做類型擦除。我們來看一個例子:

ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();  
System.out.println(l1.getClass()==l2.getClass());

運行代碼,結(jié)果為True

這是因為ArrayList 和ArrayList 在 jvm 中的 Class 都是 List.class,二者在 jvm 中等同于List

利用類型擦除干“壞事兒”

大家都知道,下面這段代碼l.add(123)無法編譯通過,因為123不是String類型,這也是使用泛型的好處之一。

ArrayList l=new ArrayList();

l.add("abc");

l.add(123);

但是我們理解了泛型擦除的原理,我們可以巧妙地利用這個原理結(jié)合反射知識干一些“壞事”,例如:

ArrayListl=new ArrayList();
    l.add("abc");    
    try {
      Method method = l.getClass().getDeclaredMethod("add",Object.class);
      method.invoke(l,"test");
      method.invoke(l,100.f);
    }catch (Exception e) {
      e.printStackTrace();
    }
    System.out.println("list的大小是:"+l.size());  
    for ( Object o: l){
      System.out.println(o);
    }

運行結(jié)果是:

list的大小是:3
abc
test
100.0(被成功插入到ArrayList中)

我們可以看見100.0 成功地插入到ArrayList 中了,所以利用類型擦除的原理并結(jié)合反射的手段就繞過了正常開發(fā)中編譯器不允許的操作限制。

通俗的理解

我們可以將泛型比作是一個看守,他來守護我們的代碼安全,然后設(shè)置各項規(guī)定,“xxx 禁止出入”的提醒。而現(xiàn)實生活中,也總會有些人能夠基于對門衛(wèi)們生活作息的規(guī)律,繞開他們的監(jiān)視(反射結(jié)合泛型擦除)來干一些壞事兒 。


網(wǎng)站題目:詳解Java泛型擦除
網(wǎng)站URL:http://www.5511xx.com/article/cceccce.html