Class.forName()詳解

官方給出了

 @CallerSensitive
    public static Class<?> forName(String className)
                throws ClassNotFoundException {
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
    }


 @CallerSensitive
    public static Class<?> forName(String name, boolean initialize,
                                   ClassLoader loader)
        throws ClassNotFoundException


//私有方法,是個(gè)本地方法,直接調(diào)用C JNI  
 /** Called after security check for system loader access checks have been made. */
    private static native Class<?> forName0(String name, boolean initialize,
                                            ClassLoader loader,
                                            Class<?> caller)
        throws ClassNotFoundException;

//測(cè)試代碼

public class ClassTest {


    public static  void main(String args[]) throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
//        Class clazz1 = A.class;
//
//        System.out.println(clazz1.newInstance().getClass().getSimpleName());
//
//
//        Class clazA = Class.forName("com.wd.bigdata.javaexample.proxy.Class.A");
//                .getConstructor(String.class,int.class,float.class)

        System.out.println("================");

        Class<?> claz = Class.forName("com.wd.bigdata.javaexample.proxy.Class.A",
                false,
                A.class.getClassLoader());

//        Object o = con.newInstance("yang",29,0.2f);
//
//        System.out.println(o.getClass().getName());
//        System.out.println(o.toString());
    }


public class A {

    private String field1;
    private int field2;
    private float field3;


    static {
        System.out.println("A static init");
    }


    public A() {
        System.out.println(" A construct ");
    }

    public A(String field1) {
        this.field1 = field1;
    }

    public A(String field1, int field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    public A(String field1, int field2, float field3) {
        this.field1 = field1;
        this.field2 = field2;
        this.field3 = field3;
    }
}

第一種通過(guò)Class.forName(name) 加載class,對(duì)于字節(jié)加載到類(lèi)加載器的過(guò)程,主要體現(xiàn)在靜態(tài)區(qū)域的初始化,測(cè)試結(jié)果也顯示,會(huì)調(diào)用靜態(tài)快
如果使用第二種方法,將初始參數(shù)設(shè)置為false,則不會(huì)調(diào)用靜態(tài)塊,從而可以得出結(jié)論,文檔中所說(shuō)的初始化主要是指靜態(tài)塊。
在這兩者調(diào)用的過(guò)程中,都會(huì)去調(diào)用構(gòu)造方法,也證明,構(gòu)造方法主要是實(shí)例化對(duì)象的時(shí)候才會(huì)被調(diào)用,在Class中從newInstance方法就能體現(xiàn)出來(lái)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容