1. 程式人生 > >反射中Class.forName()和ClassLoader.loadClass()的區別

反射中Class.forName()和ClassLoader.loadClass()的區別

Java類載入過程

類載入

載入:找到.class檔案並把這個檔案包含的位元組碼載入到記憶體中

連結:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的; 

  校驗:檢查匯入類或介面的二進位制資料的正確性;(檔案格式驗證,元資料驗證,位元組碼驗證,符號引用驗證) 

  準備:給類的靜態變數分配並初始化儲存空間; 

  解析:將常量池中的符號引用轉成直接引用; 

初始化:啟用類的靜態變數的初始化Java程式碼和靜態Java程式碼塊,並初始化程式設計師設定的變數值。

Class.forName(className)方法,內部實際呼叫的方法是
Class.forName(className,true,classloader);

第2個boolean引數表示類是否需要初始化, Class.forName(className)預設是需要初始化。

一旦初始化,就會觸發目標物件的 static塊程式碼執行,static引數也也會被再次初始化。

ClassLoader.loadClass(className)方法,內部實際呼叫的方法是
ClassLoader.loadClass(className,false);

第2個 boolean引數,表示目標物件是否進行連結,false表示不進行連結,由上面介紹可以,

不進行連結意味著不進行包括初始化等一些列步驟,那麼靜態塊和靜態物件就不會得到執行

示例

一個類,包含一個靜態塊

package com.yvan.reflex;

public class User {
    private String username;

    static{
        System.out.println("this is static block");
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
public String toString() { return "User [username=" + username + "]"; } }

Class.forName()的方式,會載入static塊

String className = User.class.getName();

        System.out.println(className);
        // 預設初始化static模組
        Class<?> object = Class.forName(className);

列印結果

com.yvan.reflex.User
this is static block

ClassLoader.loadClass()方式

public class AppMain {

    public static void main(String[] args) throws Exception {
        String className = User.class.getName();
        System.out.println(className);
        Process p = new Process();
        p.init(className);
    }


}

class Process {
    public void init(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        // 不會初始化static模組
        Class<?> object = this.getClass().getClassLoader().loadClass(className);
        //Object obj = object.newInstance();
    }
}

列印結果

com.yvan.reflex.User

相關推薦

反射Class.forName()ClassLoader.loadClass()的區別

Java類載入過程 載入:找到.class檔案並把這個檔案包含的位元組碼載入到記憶體中 連結:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;   校驗:檢查匯

反射,Class.forNameclassloader區別

Java中的Class.forName(),classLoader,都可用來對類進行載入。 而Class.forName(),除了會將.class檔案載入到jvm內之外,還會對類進行解釋,執行類中的static靜態程式碼快。 而classLoader只幹一件事,就是將.class載

Java基礎面試題6-Java反射Class.forNameclassloader區別

Java中Class.forName和classloader都可以用來對類進行載入。Class.forName除了將類的.class檔案載入到jvm中之外,還會對類進行解釋,執行類中的static塊。而classloader只幹一件事情,就是將.class檔案載入到jvm中,

反射Class.forName classloader區別

https://blog.csdn.net/qq_27093465/article/details/52262340 java中class.forName()和classLoader都可用來對類進行載入。 類載入過程為: 載入-->連結-->初始化; 載入:通過累的全限定名獲取二進位制位

反射Class.forNameclassloader區別?[中高]

相同點: java中class.forName()和classLoader都可用來對類進行載入。 不同點: class.forName()除了將類的.class檔案載入到jvm中之外,還會對類進行解釋,執行類中的static塊。 而classLoader只幹一件事情,就是將.class檔

Java反射Class.forNameClassLoader區別

前言 最近在面試過程中有被問到,在Java反射中Class.forName()載入類和使用ClassLoader載入類的區別。當時沒有想出來後來自己研究了一下就寫下來記錄一下。 解釋 在java中Class.forName()和ClassLoader都可以對類進行載入。ClassLo

java反射Class.forNameclassloader區別(程式碼說話)

java中class.forName()和classLoader都可用來對類進行載入。 class.forName()前者除了將類的.class檔案載入到jvm中之外,還會對類進行解釋,執行類中的static塊。 而classLoader只幹一件事情,就是將.class檔案

Class.forNameClassLoader.loadClass區別

ica with 宋體 註意 static ade jdbc 效果 為什麽 Class的裝載分了三個階段,loading,linking和initializing,分別定義在The Java Language Specification的12.2,12.3和12.4。 Cl

javaclass.forNameclassLoader載入類的區分

   java中class.forName和classLoader都可用來對類進行載入。前者除了將類的.class檔案載入到jvm中之外,還會對類進行解釋,執行類中的static塊。而classLoader只幹一件事情,就是將.class檔案載入到jvm中,不會執行stat

Class.forNameClassLoader區別

exception 調用 ets 測試 簡單的 gets ref static ade 一 看名字就知道了,一個是類的創建,一個類加載器 二 再看下Class.forName源碼,調用了ClassLoader @CallerSensitive

Java反射Class.forName()載入類使用ClassLoader載入類的區別

最近在面試過程中有被問到,在Java反射中Class.forName()載入類和使用ClassLoader載入類的區別。當時沒有想出來後來自己研究了一下就寫下來記錄一下。 解釋 在java中Class.forName()和ClassLoader都可以對類進行載入。ClassLoader就是遵

反射Class.forName() 與 ClassLoader.loadClass() 的區別

註意 als name ole 校驗 嚴格 載器 初始化 left 在Java中,類加載器把一個類加載進Java虛擬機中,要經過三個步驟來完成:加載、鏈接和初始化,其中鏈接又可以分成驗證、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:

class.fornameclassloader區別

Java中class是如何載入到JVM中的: 1.class載入到JVM中有三個步驟     裝載:(loading)找到class對應的位元組碼檔案。     連線:(linking)將對應的位元組碼檔案讀入到JVM中。     初始化:(initializi

class.forName()classLoader區別

java中class.forName()和classLoader都可用來對類進行載入。class.forName()前者除了將類的.class檔案載入到jvm中之外,還會對類進行解釋,執行類中的stat

Class.forNameregisterDriver的區別

http div .cn 通過 文章 函數 accep roo details 我們都知道JDBC的代碼怎麽寫,比如以MySQL JDBC為例 //註冊JDBC驅動 Class.forName("com.mysql.jdbc.Driver"); //然後就可以拿到JD

Class.getResources()classLoader.getResources()區別

ace 怎麽 資源 works ID .com print sun rop Class.getResource(String path) path不以’/‘開頭時,默認是從此類所在的包下取資源; path 以’/‘開頭時,則是從ClassPath根下獲取; packag

Class.forName import 的區別

1.  實現效果不同。 Class.forName()是java反射機制下的方法,我們可以不通過new關鍵字,而利用一個包含包路徑的完整類名獲取這個class類物件,有這個Class物件當然可以獲得相應的類的例項(在有無參建構函式的情形下)。 import  需要你在

關於反射Class.forName

問題出處:    模板方法中    public static Human createHuman(Class c){     Human human= null ;  // 定義一個型別的人類      try {     human = (Human)Class. fo

簡單談談我對Java Class.forName()、Class.class、例項物件.getClass() 三種獲取位元組碼物件的理解?(內含程式碼分析總結)

首先得明白的知識點: 1靜態屬性初始化載入類的時候初始化( 只會初始化一次),而非靜態屬性的初始化就是new類例項物件的時候初始化的 2三種獲取位元組碼物件的共同點就是都會預先的判斷記憶體是否已經載入此類,弱沒有載入,則會把.class檔案裝入到記憶體,若是載入了,則會根據class檔案生成例

java 反射(二) 反射Class常見的方法屬性

package com.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * 反射中Class常見的方法和屬