大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) Javaweb學(xué)習(xí)視頻:反射動態(tài)代理

Javaweb學(xué)習(xí)視頻:反射動態(tài)代理

更新時間:2020-03-12 09:19:07 來源:動力節(jié)點(diǎn) 瀏覽2438次


  一、類加載


  定義


  當(dāng)程序要使用某個類時,如果該類還未被加載到內(nèi)存中,則系統(tǒng)會通過加載,連接,初始化三步來實(shí)現(xiàn)對這個類進(jìn)行初始化


  加載


  就是指將.class文件讀入內(nèi)存,并為之創(chuàng)建一個Class對象。任何類被使用時系統(tǒng)都會建立一個Class對象。


  連接


  驗(yàn)證是否有正確的內(nèi)部結(jié)構(gòu),并和其他類協(xié)調(diào)一致


  準(zhǔn)備負(fù)責(zé)為類的靜態(tài)成員分配內(nèi)存,并設(shè)置默認(rèn)初始化值


  解析將類的二進(jìn)制數(shù)據(jù)中的符號引用替換為直接引用


  初始化就是我們以前講過的初始化步驟


  2.加載的時機(jī)


  創(chuàng)建類的實(shí)例


  訪問類的靜態(tài)變量,或者為靜態(tài)變量賦值


  調(diào)用類的靜態(tài)方法


  使用反射方式來強(qiáng)制創(chuàng)建某個類或接口對應(yīng)的java.lang.Class對象


  加載某個類的子類


  直接使用java.exe命令來運(yùn)行某個主類


  真正在使用這個類型的時候


  二、類加載器的概述和分類


  定義


  負(fù)責(zé)將.class文件加載到內(nèi)存中,并為之生成對應(yīng)的Class對象。雖然我們不需要關(guān)心類加載機(jī)制,但是了解這個機(jī)制我們就能更好的理解程序的運(yùn)行


  2.類加載器的分類


  BootstrapClassLoader根類加載器


  ExtensionClassLoader擴(kuò)展類加載器


  SysetmClassLoader系統(tǒng)類加載器


  AppClassLoader應(yīng)用類加載器


  3.類加載器的作用


  BootstrapClassLoader根類加載器


  也被稱為引導(dǎo)類加載器,負(fù)責(zé)Java核心類的加載


  比如System,String等。在JDK中JRE的lib目錄下rt.jar文件中


  ExtensionClassLoader擴(kuò)展類加載器


  負(fù)責(zé)JRE的擴(kuò)展目錄中jar包的加載。


  在JDK中JRE的lib目錄下ext目錄


  SysetmClassLoader系統(tǒng)類加載器


  負(fù)責(zé)在JVM啟動時加載來自java命令的class文件,以及classpath環(huán)境變量所指定的jar包和類路徑


  AppClassLoader加載其他類


  負(fù)載一些非核心類和程序猿自己寫的類


  4.演示

  publicstaticvoidmain(String[]args){

  //獲取TestDemo類的類加載器

  System.out.println(TestDemo.class.getClassLoader());

  }


  三、自定義類加載器


  雙親委派模型


  當(dāng)前類加載器從自己已經(jīng)加載的類中查詢是否此類已經(jīng)加載,如果已經(jīng)加載則直接返回原來已經(jīng)加載的類。


  如果沒有找到,就去委托父類加載器去加載(如代碼c=parent.loadClass(name,false)所示)。父類加載器也會采用同樣的策略,查看自己已經(jīng)加載過的類中是否包含這個類,有就返回,沒有就委托父類的父類去加載,一直到根類加載器。因?yàn)槿绻讣虞d器為空了,就代表使用根類類加載器作為父加載器去加載


  如果根類類加載器加載失敗(例如在$JAVA_HOME/jre/lib里未查找到該class),會使用拓展類加載器來嘗試加載,繼續(xù)失敗則會使用AppClassLoader來加載,繼續(xù)失敗則會拋出一個異常ClassNotFoundException,然后再調(diào)用當(dāng)前加載器的findClass()方法進(jìn)行加載


  2.好處


  主要是為了安全性,避免用戶自己編寫的類動態(tài)替換Java的一些核心類,比如String。


  同時也避免了類的重復(fù)加載,因?yàn)镴VM中區(qū)分不同類,不僅僅是根據(jù)類名,相同的class文件被不同的ClassLoader加載就是不同的兩個類


  案例演示

  publicclassMyClassLoaderextendsClassLoader{

  privateStringpath;

  publicMyClassLoader(Stringpath){

  super();

  this.path=path;

  }

  @Override

  protectedClass<?>findClass(Stringname)throwsClassNotFoundException{

  //讀取本地文件

  byte[]bs=getBytes(path);

  //將字節(jié)數(shù)組裝載成Class對象

  Class<?>clazz=this.defineClass(name,bs,0,bs.length);

  returnclazz;

  }

  privatebyte[]getBytes(Stringpath){

  try(

  FileInputStreamfis=newFileInputStream(path);

  ByteArrayOutputStreambos=newByteArrayOutputStream();

  ){

  byte[]bs=newbyte[1024];

  intlen;

  while((len=fis.read(bs))!=-1){

  bos.write(bs,0,len);

  }

  returnbos.toByteArray();

  }catch(Exceptione){

  }

  returnnull;

  }

  }

  publicstaticvoidmain(String[]args)throwsException{

  MyClassLoaderclassLoader=newMyClassLoader("D:\\Student.class");

  Class<?>clazz=classLoader.findClass("com.qianfeng.Student");

  //Class<?>class1=Class.forName("com.qianfeng.Student",true,classLoader);

  Objectobj=clazz.newInstance();

  System.out.println(obj.getClass().getClassLoader());

  }


  四、反射


  定義


  JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法


  對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性


  這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制


  要想解剖一個類,必須先要獲取到該類的字節(jié)碼文件對象


  而解剖使用的就是Class類中的方法,所以先要獲取到每一個字節(jié)碼文件對應(yīng)的Class類型的對象


  說白了就是獲取一個類的骨架


  2.獲取字節(jié)碼的三種方式


  對象.getClass()


  類名.class


  Class類中靜態(tài)方法forName("類名")


  3.演示

  publicstaticvoidmain(String[]args)throwsException{

  Studentstudent=newStudent();

  Class<?>clazz1=student.getClass();

  Class<?>clazz2=Student.class;

  Class<?>clazz3=Class.forName("com.qianfeng.Student");

  }


  五、反射獲取構(gòu)造函數(shù)


  定義


  Class類的newInstance()方法是使用該類無參的構(gòu)造函數(shù)創(chuàng)建對象


  如果一個類沒有無參的構(gòu)造函數(shù),就不能這樣創(chuàng)建了,可以調(diào)用Class類的getConstructor(String.class,int.class)方法獲取一個指定的構(gòu)造函數(shù)然后再調(diào)用Constructor類的newInstance("張三",20)方法創(chuàng)建對象


  2.演示

  publicstaticvoidmain(String[]args)throwsException{

  Class<?>clazz=Class.forName("com.qianfeng.Student");

  Studentobject=(Student)clazz.newInstance();

  object.method();

  }


Javaweb學(xué)習(xí)視頻:反射動態(tài)代理


    以上就是動力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Javaweb學(xué)習(xí)視頻:反射動態(tài)代理”的內(nèi)容,希望對大家有幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時為你服務(wù)。


提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 一级特级aaa毛片 | 玖玖色视频 | 不卡无毒免费毛片视频观看 | 四虎影院观看视频 | 国产精品久久毛片 | 国产成人精品高清在线 | 日日爽爽 | 国产精品乱码在线观看 | 国产午夜成人无码免费看 | 一级毛片牲交大片 | 久操国产视频 | 婷婷99| 国产色婷婷精品综合在线手机播放 | 久久亚洲精品玖玖玖玖 | 亚洲宗合 | 亚洲精品在线视频 | 精品欧美高清一区二区免费 | 国产97色在线 | 免费 | 热久久99影院 | 114一级毛片免费 | 久久青草免费线观最新 | 欧美猛交xxxxx | 韩国日本一级毛片免费视频 | 亚洲情综合五月天 | 成人影院午夜久久影院 | 99精品视频免费 | 欧美成人一区二区三区不卡视频 | 久久精品国产99国产精品亚洲 | 香蕉视频免费在线看 | 国产精品久久新婚兰兰 | 国产成人在线视频播放 | 欧美久久久久久 | 欧美特黄一级大黄录像 | 人人干天天干 | 国产精品视频第一区二区 | 久久大胆视频 | 欧美日韩一区二区三区麻豆 | 91久草视频 | 久草美女 | 伊人免费在线观看 | 97高清国语自产拍 |