首先兩種方式在源碼里所在的位置:
Class.newInstance() → Inside java.lang 包
Constructor.newInstance() → Inside java.lang.reflect 包
Class.newInstance():
Class.forName("HelloWorld").newInstance();
或者
HelloWorld.class.newInstance();
Constructor.newInstance()
HelloWorld.class.getConstructor().newInstance();二者區別:
Class.newInstance()只能反射無參的構造器; Constructor.newInstance()可以反任何構造器; Class.newInstance()需要構造器可見(visible); Constructor.newInstance()可以反私有構造器; Class.newInstance()對于捕獲或者未捕獲的異常均由構造器拋出; Constructor.newInstance()通常會把拋出的異常封裝成InvocationTargetException拋出;
因為以上差異,所以很多框架使用的都是構造器反射的方式獲取對象,像Spring, Guava, Zookeeper, Jackson, Servlet 等。
源碼:version:jdk1.8
直接類名反射實例化對象
@CallerSensitive public T newInstance() throws InstantiationException, IllegalAccessException { if (System.getSecurityManager() != null) { checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), false); } // NOTE: the following code may not be strictly correct under // the current Java memory model. // Constructor lookup if (cachedConstructor == null) { if (this == Class.class) { throw new IllegalAccessException( "Can not call newInstance() on the Class for java.lang.Class" ); } try { Class>[] empty = {}; final Constructorc = getConstructor0(empty, Member.DECLARED); // Disable accessibility checks on the constructor // since we have to do the security check here anyway // (the stack depth is wrong for the Constructor"s // security check to work) java.security.AccessController.doPrivileged( new java.security.PrivilegedAction () { public Void run() { c.setAccessible(true); return null; } }); cachedConstructor = c; } catch (NoSuchMethodException e) { throw (InstantiationException) new InstantiationException(getName()).initCause(e); } } Constructor tmpConstructor = cachedConstructor; // Security check (same as in java.lang.reflect.Constructor) int modifiers = tmpConstructor.getModifiers(); if (!Reflection.quickCheckMemberAccess(this, modifiers)) { Class> caller = Reflection.getCallerClass(); if (newInstanceCallerCache != caller) { Reflection.ensureMemberAccess(caller, this, null, modifiers); newInstanceCallerCache = caller; } } // Run constructor try { return tmpConstructor.newInstance((Object[])null); } catch (InvocationTargetException e) { Unsafe.getUnsafe().throwException(e.getTargetException()); // Not reached return null; } }
反射構造器實例化對象:
@CallerSensitive public T newInstance(Object ... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (!override) { if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) { Class> caller = Reflection.getCallerClass(); checkAccess(caller, clazz, null, modifiers); } } if ((clazz.getModifiers() & Modifier.ENUM) != 0) throw new IllegalArgumentException("Cannot reflectively create enum objects"); ConstructorAccessor ca = constructorAccessor; // read volatile if (ca == null) { ca = acquireConstructorAccessor(); } @SuppressWarnings("unchecked") T inst = (T) ca.newInstance(initargs); return inst; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69920.html
摘要:反射機制前言更多文章請一步本人博客網頁版的的離線版什么是反射機制反射是語言的一個特性,它允程序在運行時注意不是編譯的時候來進行自我檢查并且對內部的成員進行操作。這個構造器就是用的反射在動態加載的時候來獲取的中類的屬性的。 Java反射機制 前言 更多文章請一步本人博客https://chenjiabing666.github.io/ 網頁版的jdk的API 離線版API 什么是反射...
摘要:不包含父類或父接口的方法返回,根據方法名和類型獲取。類或接口的及父類父接口公共成員方法。是的返回方法名,不包括修飾符,參數和返回值。打印打印拋出因為的訪問權限為拋出,因為是父類的方法。 反射機制呢就是在程序運行時,動態的獲取類(class),類的方法(method)屬性(field)等。主要的注意點就是程序運行時動態的獲取。這里主要是從代碼的角度來講解Java反射。在使用中我們用的較多...
摘要:使用關鍵字這是最常見的創建對象的方法,并且也非常簡單。我們可以通過用以下方式創建對象或者使用構造函數類的方法與使用類的方法相似,類中有一個可以用來創建對象的函數方法。在反序列化中,虛擬機不會使用任何構造函數來創建對象。 作為Java開發者,我們每天都會創建大量的對象,但是,我們總是使用管理依賴系統(如Spring框架)來創建這些對象。其實還有其他方法可以創建對象,在接下來的文章中我會進...
摘要:方法區在實際內存空間站可以是不連續的。這一規定,可以說是給了虛擬機廠商很大的自由。但是值得注意的是,堆其實還未每一個線程單獨分配了一塊空間,這部分空間在分配時是線程獨享的,在使用時是線程共享的。 在我的博客中,之前有很多文章介紹過JVM內存結構,相信很多看多我文章的朋友對這部分知識都有一定的了解了。 那么,請大家嘗試著回答一下以下問題: 1、JVM管理的內存結構是怎樣的? 2、不同的...
閱讀 964·2023-04-26 02:56
閱讀 9438·2021-11-23 09:51
閱讀 1850·2021-09-26 10:14
閱讀 2980·2019-08-29 13:09
閱讀 2154·2019-08-26 13:29
閱讀 571·2019-08-26 12:02
閱讀 3562·2019-08-26 10:42
閱讀 3000·2019-08-23 18:18