有人在jdk源碼里下毒【class.newInstance() bug復現】
如圖
在用反射的時候,發現這個方法被idea劃橫杠了
稍加思索后發現是這方法從jdk9開始棄用了,倒不影響使用,對象還是能正常射出來,就是看著很難受
(最近剛把本地開發機從8升到11,難怪)
說下我自己對文檔的理解
三個重點:
棄用時間:從jdk9開始;
棄用原因:以前的newInstance()有bug,異常抓不到,bug后面會演示;
替代方法:clazz.getDeclaredConstructor().newInstance(),通過把構造方法中的所有異常裝進InvocationTargetException來避免異常逃逸;
bug復現:
隨便來個類
public class InstanceTest { public InstanceTest() { System.out.println("this is noArgsConstructor"); throw new RuntimeException("make a exception"); } public static void main(String[] args) { try { InstanceTest instance = InstanceTest.class.newInstance(); } catch (InstantiationException e) { System.out.println("catch InstantiationException:" + e.getMessage()); } catch (IllegalAccessException e) { System.out.println("catch IllegalAccessException:" + e.getMessage()); } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
潤一下
一片紅,看吧,我們拋的運行時異常沒被吃掉
再來潤一潤新款 class.getDeclaredConstructor().newInstance();
成功吃掉
不要好奇,注釋中說了,所有異常都會被包進 InvocationTargetException
又是一個平平無奇的小知識點送給大家
ok我話說完
JDK
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。