燒墾、乾旱、泥炭層裸露 大火肆虐2個月 蘇門答臘虎、象失去家園

環境資訊中心外電;范震華 翻譯;賴慧玲 審校;稿源:Mongabay本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※何謂NBR手套,其特性及功能為何?

※選購空壓機需注意八大事項 !

※一條龍物流瞄準台中港倉儲,未來商機 !

※飲用桶裝水到底安不安全? 破解錯誤迷思!

新北市轉軸新北市探針選用參考標準?

台灣媽祖魚保育聯盟分析,現有個體老化又沒有新的個體誕生

台灣媽祖魚保育聯盟分析,現有個體老化又沒有新的個體誕生,族群數量一直無法擴大。而目前統計,從2000年到2019年擱淺的個體數就有11隻,更讓人擔心族群數量面臨威脅。而專家表示,最近幾年發現的鯨豚,外觀多有碰撞的傷痕,除了和漁業活動有關,海上開發案的進行可能也是鯨豚的衝擊來源。國立自然科學博物館助理研究員姚秋如說:「人為的開發壓力很大,包含海岸的人工化,以及海上會有些工程(海上風機),在這個過程中,船隻來往等等都可能造成鯨豚生活被影響。」

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※幫你考照過關,堆高機裝卸操作教學影片大公開 !

※高效率洗滌塔活性碳設備,能去除多少有機溶劑?

※飲用桶裝水到底安不安全? 破解錯誤迷思!

※家庭、朋友聚會,享受輕鬆烤肉必備外燴烤爐NO.1

新北市探針業者,哪家可以精準車製?

※十大封口機人氣排行榜-烘焙必備幫手!

白海豚近三年都僅60隻 環團憂族群老化危機

摘錄自2019年12月31日公視報導

鯨豚擱淺事件頻傳。根據台灣媽祖魚保育聯盟提出的數據,台灣海域的白海豚族群,這三年都在60隻上下。學者表示,漁業行為干擾、海上開發案離岸風機,都讓白海豚面臨考驗。

白海豚在海面悠游,時而浮出水面,這樣的畫面未來可能越來越少見。台灣媽祖魚保育聯盟提出研究數字,台灣海域附近的白海豚,估計族群數這三年都只在60隻上下,族群數沒有明顯增加。保育人士擔心,現有族群已經面臨老化。台灣媽祖魚保育聯盟理事長陳秉亨表示,「(現存的)這60幾隻,有可能裡面都是年紀很大的,因為小的海豚比較脆弱,牠比較難長大。那如果這60幾隻,大部分都是那種年紀很大的,牠可能年紀到了之後就會死掉,所以,可能就會呈現(族群)快速瓦解。」

台灣媽祖魚保育聯盟分析,現有個體老化又沒有新的個體誕生,族群數量一直無法擴大。而目前統計,從2000年到2019年擱淺的個體數就有11隻,更讓人擔心族群數量面臨威脅。而專家表示,最近幾年發現的鯨豚,外觀多有碰撞的傷痕,除了和漁業活動有關,海上開發案的進行可能也是鯨豚的衝擊來源。國立自然科學博物館助理研究員姚秋如說:「人為的開發壓力很大,包含海岸的人工化,以及海上會有些工程(海上風機),在這個過程中,船隻來往等等都可能造成鯨豚生活被影響。」

姚秋如指出,鯨豚是以靠聽覺定位的動物。海上開發案的進行,風機打樁的聲響都會影響鯨豚活動。而白海豚屬於淺海活動,更容易受到影響。保育人士呼籲,希望未來15年內,白海豚數量可達到百隻以上,才算相對安全。同時呼籲開發案,應該要有積極性的復育對策。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※各大品牌中古空壓機買賣情報站

※【找工作】徵求中部倉庫堆高機人員

※選用哪種桶裝水,外宿露營超方便?

連續封口機購物網-不怕你比價,就怕你買貴!

塑膠射出成型不良品原因及改善對策 !

台水公司編列2年20億 汰換新北老舊水管

摘錄自2019年12月31日中央社報導

台灣自來水公司31日表示,編列兩年新台幣20億元,汰換新北市15公里的老舊自來水管。

台水31日在新北市道路安全會報簡報自來水管線汰舊更新資料,報告中指出,增加編列預算為兩年20億元,預計2020年、2021年更新板橋區、新莊區、三峽區、樹林區、瑞芳區共約15公里大口徑的老舊自來水管。

侯友宜指示工務局列出汰換自來水管改善時程表。同時,希望台水全力衝刺,儘速完成汰換並更新30年以上的老舊自來水管。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※專業客製化禮物、贈品設計,辦公用品常見【L夾】搖身一變大受好評!!

示波器探測執行效能最佳化的8大秘訣

※選用哪種桶裝水,外宿露營超方便?

※(全省)堆高機租賃保養一覽表

※DIY自行施工建築隔熱紙,簡易教學大公開 !

※票選推薦煮婦最愛手壓封口機,省荷包不犧牲品質

由於情況來得突然,讓現場消防人員措手不及

由於情況來得突然,讓現場消防人員措手不及,重達10公噸的消防車就這樣被火龍捲給捲起、掀翻再摔回地面,車內消防人員因此受困,其中年僅28歲的義消塞繆爾.麥克保羅(Samuel McPaul)不幸喪命,同車另外兩員則是受到輕重傷。

他是新南威爾斯地區這個野火季以來,第三名殉職的消防人員。另外兩名分別為32歲的基頓和36歲的歐德懷爾,19日晚間在雪梨近郊和失控野火奮鬥時,因消防車撞到倒下的樹翻覆,不幸身亡。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※影響示波器測試準確度的五大因素

※無毒橡膠墊片哪裡買的到?

※飲用桶裝水到底安不安全? 破解錯誤迷思!

※十大封口機人氣排行榜-烘焙必備幫手!

連續封口機購物網-不怕你比價,就怕你買貴!

※買不起高檔茶葉,精緻包裝茶葉罐,也能撐場面!

實現websocket 主動消息推送,用laravel+Swoole

近來有個需求:想實現一個可以主動觸發消息推送的功能,這個可以實現向模板消息那個,給予所有成員發送自定義消息,而不需要通過客戶端發送消息,服務端上message中監聽傳送的消息進行做相對於的業務邏輯。

主動消息推送實現
平常我們採用 swoole 來寫 WebSocket 服務可能最多的用到的是open,message,close這三個監聽狀態,但是萬萬沒有看下下面的onRequest回調的使用,沒錯,解決這次主動消息推送的就是需要用onRequest回調。
官方文檔:正因為swoole_websocket_server繼承自swoole_http_server,所以在 websocket 中有onRequest回調。

詳細實現:

 1 # 這裡是一個laravel中Commands
 2 # 運行php artisan swoole start 即可運行
 3 <?php
 4 
 5 namespace App\Console\Commands;
 6 
 7 use Illuminate\Console\Command;
 8 use swoole_websocket_server;
 9 
10 class Swoole extends Command
11 {
12     public $ws;
13     /**
14      * The name and signature of the console command.
15      *
16      * @var string
17      */
18     protected $signature = 'swoole {action}';
19 
20     /**
21      * The console command description.
22      *
23      * @var string
24      */
25     protected $description = 'Active Push Message';
26 
27     /**
28      * Create a new command instance.
29      *
30      * @return void
31      */
32     public function __construct()
33     {
34         parent::__construct();
35     }
36 
37     /**
38      * Execute the console command.
39      *
40      * @return mixed
41      */
42     public function handle()
43     {
44         $arg = $this->argument('action');
45         switch ($arg) {
46             case 'start':
47                 $this->info('swoole server started');
48                 $this->start();
49                 break;
50             case 'stop':
51                 $this->info('swoole server stoped');
52                 break;
53             case 'restart':
54                 $this->info('swoole server restarted');
55                 break;
56         }
57     }
58 
59     /**
60      * 啟動Swoole
61      */
62     private function start()
63     {
64         $this->ws = new swoole_websocket_server("0.0.0.0", 9502);
65         //監聽WebSocket連接打開事件
66         $this->ws->on('open', function ($ws, $request) {
67         });
68         //監聽WebSocket消息事件
69         $this->ws->on('message', function ($ws, $frame) {
70             $this->info("client is SendMessage\n");
71         });
72         //監聽WebSocket主動推送消息事件
73         $this->ws->on('request', function ($request, $response) {
74             $scene = $request->post['scene'];       // 獲取值
75             $this->info("client is PushMessage\n".$scene);
76         });
77         //監聽WebSocket連接關閉事件
78         $this->ws->on('close', function ($ws, $fd) {
79             $this->info("client is close\n");
80         });
81         $this->ws->start();
82     }
83 }

 

前面說的是 swoole 中onRequest的實現,下面實現下在控制器中主動觸發onRequest回調。實現方法就是我們熟悉的curl請求。

 1 # 調用activepush方法以後,會在cmd中打印出 
 2 # client is PushMessage 主動推送消息 字眼
 3     /**
 4      * CURL請求
 5      * @param $data
 6      */
 7     public function curl($data)
 8     {
 9         $curl = curl_init();
10         curl_setopt($curl, CURLOPT_URL, "http://127.0.0.1:9502");
11         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
12         curl_setopt($curl, CURLOPT_HEADER, 1);
13         curl_setopt($curl, CURLOPT_POST, 1);
14         curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
15         curl_exec($curl);
16         curl_close($curl);
17     }
18     
19     /**
20      * 主動觸發
21      */
22     public function activepush()
23     {
24         $param['scene'] = '主動推送消息';
25         $this->curl($param);            // 主動推送消息

 

用途
onRequest 回調特別適用於需要在控制器中調用的推送消息,比如模板消息之類,在控制器中調用。

 

推薦閱讀:

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

ef+Npoi導出百萬行excel之踩坑記

        最近在做一個需求是導出較大的excel,本文是記錄我在做需求過程中遇到的幾個問題和解題方法,給大家分享一下,一來可以幫助同樣遇到問題的朋友,二呢,各位大神也許有更好的方法可以指點小弟一下,讓我順便學習一下。 背景::工頭:“小鍾啊,xx界面加個導出excel功能03以後的格式,需要能支持到excel的最大行,同時需要5個併發就行” 我:“收到,但是數據大的時候速度可能比較慢。” 工頭:“你先做後續客戶反饋了在給他加進度條。” Npoi神器介紹:SXSSFWorkbook 專門用來導出大數據用,他會把數據先寫入C盤的臨時目錄;不會所有 都留在內存里;更詳細介紹請百度或者參考( ) 有了這層基礎開始劈里啪啦一段操作寫代碼;(以下代碼非生產代碼只是我為了帖子寫重現問題的測試代碼) 首先開個線程模擬併發 編寫導出方法:記錄時間、創建SXSSFWorkbook 代碼如圖: 啟動運行; 好!第一口鍋已造好,看這個提示,前面說了SXSSFWorkbook 是會先把緩存數據寫入Windows臨時文件裡頭的,這個目錄正好是Windows的臨時文件夾雖然是個錯誤但是驗證了剛剛的說法;至於這個錯誤看提示 我們有個大膽的想法是文件佔用問題,應該是創建文件的時候文件已經存在了,這樣我們把npoi的dll打開來看看,通過看源碼和各種f12我們看到了這麼一段代碼 這裏看到用來隨機數,而我們知道net的隨機數在極短的時間內生成是不可靠的(詳見百度或者: )也就是說生成一樣的文件名,然後我們在通過 github里可以看到   早在年初NPOI就對這個問題做了更改就換成guid了,隨後我來到了nuget nuget最新版 是去年12月份發布,並沒有包含上面的更改; 所以呢 要麼github下載最新版編譯要麼自己解決,想了想如果換版本的話以前的功能可能會影響到所以,我們就在外面加一把小鎖吧!如圖   這樣呢我們在試試!   很好 不會在出現文件佔用問題了;好繼續導出! 既然是都先寫入緩存文件是不是佔用的內存就很小了 來看看 2G多。。。什麼情況,還在漲   3G。。。這明顯不符合工頭的需求了,然後終於它炸了 第一念頭是為啥我該怎麼辦,設置GC的回收模式?手動多GC?還是要把代碼給拿下來看看,看看這麼大內存哪裡沒釋放文件?冷靜、冷靜、想想,既然是內存爆了 那麼正確流程應該是抓取看看是什麼吃的內存得出結果再去改東西, 發現了啥是不是很熟悉的東西? 狀態管理、包裝類,想到了啥 EF的“模型跟蹤”這個功能佔用的內存最大了。那就去掉吧 加上這麼一句 意思是無跟蹤查詢 ,修改實例后SaveChanges不對對它生效; (AsNoTracking 更詳情理解介紹請百度在加上msdn: ) 現在在繼續導出看看: 內存是吃的不大了, 可以看出臨時文件還是很大的,這還沒導完呢,所以做的時候 盡量要保證下硬盤的空間! 等待。。。 總結: 1.導出大數據用SXSSFWorkbook 2.構建SXSSFWorkbook 時候lock或者自己編譯最新版本 3.我們做導出時,ef查詢數據後記得加AsNoTracking 關閉綁定跟蹤。(以後日常開發中如果只需要查詢的也可以這樣做) 4.SXSSFWorkbook 導出大數據 臨時文件夾所在的硬盤不能太小 因為會生成大於excel本身的緩存文件!     最後導出完畢 用時:  本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

類加載器 – 命名空間

本博客將沿用中展示的自定義類加載器代碼

複雜類加載情況分析

測試代碼一

首先,新建一個類Test14,重寫默認的構造方法,打印加載該類的類加載器

public class Test14 {
    public Test14() {
        System.out.println("Test14 is loaded by:" + this.getClass().getClassLoader());
    }
}

然後,在新建一個類Test15,同樣重寫默認的構造方法,打印加載該類的類加載器,在構造方法中new出Test14的實例

public class Test15 {
    public Test15() {
        System.out.println("Test15 is loaded by:" + this.getClass().getClassLoader());

        new Test14();
    }
}

測試代碼

public class Test16 {
    public static void main(String[] args) throws Exception {
        test01();
    }

    private static void test01 () throws Exception {
        ClassLoaderTest classLoader = new ClassLoaderTest("classLoader");
        Class<?> clazz = classLoader.loadClass("classloader.Test15");
        System.out.println("class:" + clazz);
        Object object = clazz.newInstance();
    }
}

猜測一下,首先自定義類加載器classLoader通過反射獲取Test15的Class對象,屬於主動使用,會加載Test15,classLoader委託它的父加載器AppClassLoader加載Test15;然後我們通過clazz.newInstance();代碼獲取Test15的實例,調用Test15的構造方法,在Test15的構造方法中創建了Test14的實例,所以同樣加載了Test14,並調用了Test14的構造方法。加上-XX:+TraceClassLoading指令執行代碼,發現運行結果和我們想的是一樣的。

......
[Loaded classloader.Test15 from file:/home/fanxuan/Study/java/jvmStudy/out/production/jvmStudy/]
class:class classloader.Test15
Test15 is loaded by:sun.misc.Launcher$AppClassLoader@18b4aac2
[Loaded classloader.Test14 from file:/home/fanxuan/Study/java/jvmStudy/out/production/jvmStudy/]
Test14 is loaded by:sun.misc.Launcher$AppClassLoader@18b4aac2
......

測試代碼二

在上篇博客中,自定義類加載器ClassLoaderTest是有一個path屬性可以自定義類的加載路徑的,我們同樣測試一下,我們將Test14和Test15的class文件放到桌面的classloader文件夾下,然後刪除工程路徑下的class文件,執行一下的測試代碼

public class Test16 {
    public static void main(String[] args) throws Exception {
        test02();
    }
    private static void test02 () throws Exception {
        ClassLoaderTest classLoader = new ClassLoaderTest("classLoader");
        classLoader.setPath("/home/fanxuan/桌面/");
        Class<?> clazz = classLoader.loadClass("classloader.Test15");
        System.out.println("class:" + clazz);
        Object object = clazz.newInstance();
    }
}

按照上節的結果,應該都是ClassLoaderTest加載器加載了Test14和Test15類

class:class classloader.Test15
Test15 is loaded by:classloader.ClassLoaderTest@6d6f6e28
Test14 is loaded by:classloader.ClassLoaderTest@6d6f6e28

接下來,我們重新編譯項目,刪除掉工程目錄下的Test14的calss文件,再次執行代碼

class:class classloader.Test15
Test15 is loaded by:sun.misc.Launcher$AppClassLoader@18b4aac2
Exception in thread "main" java.lang.NoClassDefFoundError: classloader/Test14
    at classloader.Test15.<init>(Test15.java:11)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at classloader.Test16.test02(Test16.java:25)
    at classloader.Test16.main(Test16.java:9)
Caused by: java.lang.ClassNotFoundException: classloader.Test14
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 8 more

我們發現結果報錯了,按照我們正常的思維,自定義記載器classLoader委託父加載器AppClassLoader加載Test15,從打印結果可以看出Test15加載成功了,然後創建Test15的實例,加載Test14,因為工程目錄下缺少Test14的class文件,所以AppClassLoader無法加載到Test14,由自定義加載器classLoader自身從桌面加載Test14。但是我們發現加載Test14的報了ClassNotFoundException的錯誤,這是因為在Test15中記載Test14的時候,是以Test15的類加載器AppClassLoader來加載的,AppClassLoader加載不到Test14,它的父加載器擴展類加載器同樣加載不到,擴展類加載器的父加載器啟動類加載器也加載不到,所以報錯ClassNotFoundException

然後,再重新編譯項目,刪除掉工程目錄下的Test15的calss文件,再次執行代碼。根據前文分析的代碼,我們可以很清晰的得出結論:由自定義記載器classLoader加載了Test15,由系統類記載器AppClassLoader加載了Test14。

class:class classloader.Test15
Test15 is loaded by:classloader.ClassLoaderTest@6d6f6e28
Test14 is loaded by:sun.misc.Launcher$AppClassLoader@18b4aac2

測試代碼三

簡單修改下Test14類,在Test14的構造方法中引用Test15的Class對象。

public class Test14 {
    public Test14() {
        System.out.println("Test14 is loaded by:" + this.getClass().getClassLoader());

        System.out.println("Test14:" + Test15.class);
    }
}

執行測試代碼二中的測試代碼Test16,結果如下,沒有任何問題。

class:class classloader.Test15
Test15 is loaded by:sun.misc.Launcher$AppClassLoader@18b4aac2
Test14 is loaded by:sun.misc.Launcher$AppClassLoader@18b4aac2
Test14:class classloader.Test15

我們同樣重新編譯項目,刪除掉工程目錄下的Test15的calss文件,再次執行代碼。

class:class classloader.Test15
Test15 is loaded by:classloader.ClassLoaderTest@6d6f6e28
Test14 is loaded by:sun.misc.Launcher$AppClassLoader@18b4aac2
Exception in thread "main" java.lang.NoClassDefFoundError: classloader/Test15
    at classloader.Test14.<init>(Test14.java:11)
    at classloader.Test15.<init>(Test15.java:11)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at classloader.Test16.test02(Test16.java:25)
    at classloader.Test16.main(Test16.java:9)
Caused by: java.lang.ClassNotFoundException: classloader.Test15
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 9 more

我們發現加載已經完成了,但是程序還是報錯了,是我們剛剛加的System.out.println("Test14:" + Test15.class);代碼報的錯,依然是ClassNotFoundException錯誤。

分析:
Test15由自定義記載器classLoader加載,Test14由系統類記載器AppClassLoader加載。導致程序報錯的是因為命名空間的問題,我們在上一篇博客的結尾簡單介紹了命名空間:每個類加載器都有自己的命名空間,命名空間由該加載器及所有的父加載器所加載的類組成。子加載器所加載的類可以看見父加載器加載的類,但是父加載器所加載的類無法看見子加載器加載的類。Test14是由AppClassLoader加載的,在AppClassLoader的命名空間中沒有Test15的,所以程序報錯了。

命名空間實例分析

測試代碼

新建Entity類用於測試

public class Entity {
    private Entity entity;

    public void setEntity(Object entity) {
        this.entity = (Entity)entity;
    }
}

編寫測試代碼

public class Test17 {
    public static void main(String[] args) throws Exception {
        ClassLoaderTest classLoader1 = new ClassLoaderTest("classLoader1");
        ClassLoaderTest classLoader2 = new ClassLoaderTest("classLoader2");

        Class<?> clazz1 = classLoader1.loadClass("classloader.Entity");
        Class<?> clazz2 = classLoader2.loadClass("classloader.Entity");

        System.out.println(clazz1 == clazz2);

        Object object1 = clazz1.newInstance();
        Object object2 = clazz2.newInstance();

        Method method = clazz1.getMethod("setEntity", Object.class);
        method.invoke(object1, object2);
    }
}

運行程序,System.out.println(clazz1 == clazz2);返回結果為true,都是AppClassLoader加載的,classLoader1加載之後會在AppClassLoader的命名空間中形成緩存,classLoader2加載的時候直接返回命名空間已經存在的Class對象,所以clazz1與clazz2相同。

改造下代碼,將Entity類的class文件copy到桌面文件夾下,刪除工程下的class文件,執行如下代碼

public class Test18 {
    public static void main(String[] args) throws Exception {
        ClassLoaderTest classLoader1 = new ClassLoaderTest("classLoader1");
        ClassLoaderTest classLoader2 = new ClassLoaderTest("classLoader2");

        classLoader1.setPath("/home/fanxuan/桌面/");
        classLoader2.setPath("/home/fanxuan/桌面/");

        Class<?> clazz1 = classLoader1.loadClass("classloader.Entity");
        Class<?> clazz2 = classLoader2.loadClass("classloader.Entity");

        System.out.println(clazz1 == clazz2);

        Object object1 = clazz1.newInstance();
        Object object2 = clazz2.newInstance();

        Method method = clazz1.getMethod("setEntity", Object.class);
        method.invoke(object1, object2);
    }
}

根據前文的介紹,不難推斷System.out.println(clazz1 == clazz2);的運行結果為falseclassLoader1和classLoader2分別加載了Entity類,就是其自身加載的(定義類加載器),在jvm的內存中形成了完全獨立的兩個命名空間,所以clazz1與clazz2不同。而且因為clazz1和clazz2相互不可見,調用了classLoader1命名空間中的方法,傳入了classLoader2命名空間的對象,導致程序拋出了異常。

false
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at classloader.Test18.main(Test18.java:26)
Caused by: java.lang.ClassCastException: classloader.Entity cannot be cast to classloader.Entity
    at classloader.Entity.setEntity(Entity.java:11)
    ... 5 more

不同類加載器的命名空間關係

  • 同一命名空間內的類是相互可見的
  • 子加載器的命名空間包含所有父加載器的命名空間,由子加載器所加載的類可以看見父加載器加載的類
  • 由父加載器所加載的類無法看見子加載器加載的類
  • 如果兩個加載器之間沒有任何直接或間接的父子關係,那麼它們各自加載的類相互不可見

父親委託機制的好處

在的2.1章節簡單介紹了一下類加載器的父親委託機制,這裏面來總結一下好處

  • 確保Java核心類庫的安全:所有的Java應用都至少會引用java.lang.Object類,也就是說在運行期,java.lang.Object類會被記載到Java虛擬機當中;如果這個加載過程是由Java應用自己的類加載器所完成的,那麼可能會在JVM中存在多個版本的java.lang.Object類,而且這些類還是不兼容的、相互不可見的(因為命名空間的原因)。藉助父親委託機制,Java核心類庫中的類的加載工作都是由啟動類加載器來統一完成的,從而確保了Java應用所使用的都是同一個版本的Java核心類庫,他們之間是互相兼容的。
  • 確保Java核心類庫提供的類不會被自定義的類所替代。
  • 不同的類加載器可以為相同名稱(binary name)的類創建額外的命名空間。相同名稱的類可以並存在Java虛擬機中,只需要用不同的類加載器來加他們即可,不同類加載器所加載的類是不兼容的,這就相當於在Java虛擬機內部創建了一個又一個相互隔離的Java類空間。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

苑裡水圳變泡泡河 廢水源頭成謎

摘錄自2019年12月30日中央社報導

苗栗縣苑裡鎮社苓里一處灌排圳冒出大量泡沫,地方人士懷疑不肖工廠趁雨天排放廢水;大量白色泡沫覆蓋溝渠水面,宛如一條泡泡河,地方人士指出,泡沫隨水流入農田,且溝渠亦有綠色、乳白色等顏色廢水,憂心影響農作,也有民眾將照片po網,認為苑裡經典小鎮出現泡泡奇景;環保局稽查員等人循泡泡往上游追查,一度懷疑一間廢棄顏料工廠,但巡查周邊水路卻無直接排放跡象,在缺乏直接證據下,無法斷定來源,原因成謎。

縣府環保局表示,經循泡泡往上追查,無直接證據證明污染源頭,將持續加強巡查。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※何謂NBR手套,其特性及功能為何?

※選購空壓機需注意八大事項 !

※一條龍物流瞄準台中港倉儲,未來商機 !

※飲用桶裝水到底安不安全? 破解錯誤迷思!

新北市轉軸新北市探針選用參考標準?

網民揭山東偷排污 污水管深埋入海口

摘錄自2020年1月1日大紀元報導

據報,有中國網民近日發表一則視頻,批露山東省龍口市的排污管道深埋於入海口處偷排污水,污染狀況令人震驚。

該拍攝者說,山東龍口濱海大道附近的入海口處,海水退潮後沙灘裸露,有黑色的污水流入大海,且有一股刺鼻的味道。在排污口附近,還有一個黑色管道通向更深處的海中。

山東龍口偷排污水的視頻被曝光後,受到網民的廣泛關注。日前,當地官方的回應也證實了此視頻的真實性。

據《新京報》報導,上(12)月30日晚,龍口市委宣傳部稱,視頻中的上游管道已完全封閉,下游管道全部拆除。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※幫你考照過關,堆高機裝卸操作教學影片大公開 !

※高效率洗滌塔活性碳設備,能去除多少有機溶劑?

※飲用桶裝水到底安不安全? 破解錯誤迷思!

※家庭、朋友聚會,享受輕鬆烤肉必備外燴烤爐NO.1

新北市探針業者,哪家可以精準車製?

※十大封口機人氣排行榜-烘焙必備幫手!