国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

通過Class.newInstance()和Constructor.newInstance()兩種反

dreamans / 2921人閱讀

首先兩種方式在源碼里所在的位置

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 Constructor c = 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反射機制

    摘要:反射機制前言更多文章請一步本人博客網頁版的的離線版什么是反射機制反射是語言的一個特性,它允程序在運行時注意不是編譯的時候來進行自我檢查并且對內部的成員進行操作。這個構造器就是用的反射在動態加載的時候來獲取的中類的屬性的。 Java反射機制 前言 更多文章請一步本人博客https://chenjiabing666.github.io/ 網頁版的jdk的API 離線版API 什么是反射...

    wua_wua2012 評論0 收藏0
  • 進擊的Android工程師之Java基礎: 反射

    摘要:不包含父類或父接口的方法返回,根據方法名和類型獲取。類或接口的及父類父接口公共成員方法。是的返回方法名,不包括修飾符,參數和返回值。打印打印拋出因為的訪問權限為拋出,因為是父類的方法。 反射機制呢就是在程序運行時,動態的獲取類(class),類的方法(method)屬性(field)等。主要的注意點就是程序運行時動態的獲取。這里主要是從代碼的角度來講解Java反射。在使用中我們用的較多...

    aaron 評論0 收藏0
  • Java中創建對象的5種不同方法

    摘要:使用關鍵字這是最常見的創建對象的方法,并且也非常簡單。我們可以通過用以下方式創建對象或者使用構造函數類的方法與使用類的方法相似,類中有一個可以用來創建對象的函數方法。在反序列化中,虛擬機不會使用任何構造函數來創建對象。 作為Java開發者,我們每天都會創建大量的對象,但是,我們總是使用管理依賴系統(如Spring框架)來創建這些對象。其實還有其他方法可以創建對象,在接下來的文章中我會進...

    Bmob 評論0 收藏0
  • 萬萬沒想到,JVM內存結構的面試題可以問的這么難?

    摘要:方法區在實際內存空間站可以是不連續的。這一規定,可以說是給了虛擬機廠商很大的自由。但是值得注意的是,堆其實還未每一個線程單獨分配了一塊空間,這部分空間在分配時是線程獨享的,在使用時是線程共享的。 在我的博客中,之前有很多文章介紹過JVM內存結構,相信很多看多我文章的朋友對這部分知識都有一定的了解了。 那么,請大家嘗試著回答一下以下問題: 1、JVM管理的內存結構是怎樣的? 2、不同的...

    CloudwiseAPM 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<