成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

dreamans / 2931人閱讀

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

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();
二者區(qū)別
Class.newInstance()只能反射無參的構(gòu)造器;
Constructor.newInstance()可以反任何構(gòu)造器;

Class.newInstance()需要構(gòu)造器可見(visible);
Constructor.newInstance()可以反私有構(gòu)造器;

Class.newInstance()對于捕獲或者未捕獲的異常均由構(gòu)造器拋出;
Constructor.newInstance()通常會把拋出的異常封裝成InvocationTargetException拋出;

因?yàn)橐陨喜町?,所以很多框架使用的都是?gòu)造器反射的方式獲取對象,像Spring, Guava, Zookeeper, Jackson, Servlet 等。

源碼:

version:jdk1.8

直接類名反射實(shí)例化對象

@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;
    }
}

反射構(gòu)造器實(shí)例化對象:

@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;
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69920.html

相關(guān)文章

  • Java反射機(jī)制

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

    wua_wua2012 評論0 收藏0
  • 進(jìn)擊的Android工程師之Java基礎(chǔ): 反射

    摘要:不包含父類或父接口的方法返回,根據(jù)方法名和類型獲取。類或接口的及父類父接口公共成員方法。是的返回方法名,不包括修飾符,參數(shù)和返回值。打印打印拋出因?yàn)榈脑L問權(quán)限為拋出,因?yàn)槭歉割惖姆椒ā? 反射機(jī)制呢就是在程序運(yùn)行時,動態(tài)的獲取類(class),類的方法(method)屬性(field)等。主要的注意點(diǎn)就是程序運(yùn)行時動態(tài)的獲取。這里主要是從代碼的角度來講解Java反射。在使用中我們用的較多...

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

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

    Bmob 評論0 收藏0
  • 萬萬沒想到,JVM內(nèi)存結(jié)構(gòu)的面試題可以問的這么難?

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

    CloudwiseAPM 評論0 收藏0

發(fā)表評論

0條評論

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