av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

80%的Java程序員不知道反射強(qiáng)行調(diào)用私有構(gòu)造器這事兒

在我之前的一篇文章里曾提到一個觀點(diǎn):“可能會有人使用反射強(qiáng)行調(diào)用我們的私有構(gòu)造器”,很多童鞋不明白Java反射機(jī)制怎么做到調(diào)用私有構(gòu)造器,今天我們來做一個實(shí)驗(yàn)。

創(chuàng)新互聯(lián)公司專注于安陸網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供安陸營銷型網(wǎng)站建設(shè),安陸網(wǎng)站制作、安陸網(wǎng)頁設(shè)計(jì)、安陸網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造安陸網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供安陸網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

實(shí)驗(yàn)代碼

 
 
 
 
  1. import java.lang.reflect.*; 
  2. public class ReflectTest {   
  3.      public static void main(String[] args) throws Exception {        
  4.         //get Constructor 
  5.         Class clazz = Class.forName("TestOne"); 
  6.         Constructor cons = clazz.getDeclaredConstructor(null);  
  7.          
  8.         //set accessible to access private constructor   
  9.         cons.setAccessible(true); //1  
  10.         cons.newInstance(null);  
  11.         cons.newInstance(null);  
  12.      } 
  13. class TestOne { 
  14.     private TestOne() {   
  15.         System.out.println("init TestOne=="+this.hashCode());   
  16.     }   

實(shí)驗(yàn)結(jié)果

注釋1處的代碼cons.setAccessible(true),執(zhí)行main函數(shù),出現(xiàn)異常Exception in thread "main" 

 
 
 
 
  1. java.lang.IllegalAccessException: Class ReflectTest can not access a member of class TestOne with modifiers "private" 

開啟1處的代碼cons.setAccessible(true),執(zhí)行main函數(shù),出現(xiàn)如下正常的初始化信息:

 
 
 
 
  1. init TestOne==12677476 
  2. init TestOne==33263331 

這說明私有構(gòu)造函數(shù)被多次成功調(diào)用,注意是私有構(gòu)造函數(shù)哦。

實(shí)驗(yàn)總結(jié)

出現(xiàn)完全不同的兩種測試結(jié)果的原因是什么?我們來剖析一下cons.setAccessible(true)函數(shù),為什么設(shè)置為true時,可以通過反射調(diào)用私有構(gòu)造器呢?我們定位到cons.setAccessible(true)源代碼,可以看到下面的英文說明,右側(cè)已經(jīng)幫助大家翻譯了一下。

也就是說,Java反射機(jī)制非常強(qiáng)大,可以根據(jù)需要繞過Java語言的訪問檢查。

原文是這樣說的:

Set the accessible flag for this object to the indicated boolean value. A value of true indicates that the reflected object should suppress Java language access checking when it is used. A value of false indicates that the reflected object should enforce Java language access checks.

翻譯過來是這樣的:

 
 
 
 
  1. 將此對象的可訪問標(biāo)志設(shè)置為指示的布爾值。 值 true 表示反射對象應(yīng)該在使用時抑制Java語言訪問檢查。 值 false 表示反射對象應(yīng)強(qiáng)制實(shí)施Java語言訪問檢查。 

【本文為專欄作者“朱國立”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號“開發(fā)者圓桌”獲取聯(lián)系和授權(quán)】

戳這里,看該作者更多好文


名稱欄目:80%的Java程序員不知道反射強(qiáng)行調(diào)用私有構(gòu)造器這事兒
文章網(wǎng)址:http://uogjgqi.cn/article/djjsogd.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流