歡迎訪問昆山寶鼎軟件有限公司網站! 設為首頁 | 網站地圖 | XML | RSS訂閱 | 寶鼎郵箱 | 后臺管理
?

新聞資訊

MENU

軟件開發知識

比如A需要 CAD加密 B模塊的方法

點擊: 次  來源:寶鼎軟件 時間:2017-06-01

原文出處: 笨狐貍

在開始Java的類加載路程之前,可以先參考這里相識一些類加載器在Tomcat中的應用。

在最初執行java這個呼吁時,便會挪用 ClassLoader 的 getSystemClassLoader 要領顯式可能隱式加載 main 要領地址的類及其所引用的類。getSystemClassLoader 會返回 AppClassLoader,后者是 URLClassLoader 的一個子類。

先有雞照舊先有蛋?

所以,最初的一個問題是:先有雞照舊先有蛋?因為 ClassLoader 的整套體系是打包在 jre/lib/rt.jar 中的。只有 rt.jar 先被加載進來,才氣夠加載此外類;可是 rt.jar 又是被誰加載的呢?自然就是臺甫鼎鼎的 BootstrapClassLoader。它就是“雞”。所以嚴格來講,BootStrapClassLoader 并不是整個別系中的一部門(可以用 -Xbootclasspath 指定bootstrap 加載的位置)。

當 rt.jar 被加載進來后,ClassLoader 會挪用 getSystemClassLoader,軟件開發,個中最重要的一步就是初始化 Launcher、ExtClassLoader 以及AppClassLoader,別的就是將 ContextClassLoader 設為 AppClassLoader。ExtClassLoader 與 AppClassLoader 都是 URLClassLoader 的子類,軟件開發,別離會加載 java.ext.dirs 和 java.class.path 路徑下的 jar資源,前者一般指向 jre/lib/ext 下的所有jar,后者就是我們常常念叨的classpath。區分這兩個 ClassLoader 的主要目標是,讓他們形成層級干系,ExtClassLoader 為 AppClassLoader 的父 ClassLoader,有了層級干系,便可隨意利用雙親委托模子了。

ClassLoader extcl;
        try {
            extcl = ExtClassLoader.getExtClassLoader();
        } catch (IOException e) {
            throw new InternalError(
                "Could not create extension class loader");
        }

        // Now create the class loader to use to launch the application
        try {
            loader = AppClassLoader.getAppClassLoader(extcl);
        } catch (IOException e) {
            throw new InternalError(
                "Could not create application class loader");
        }

        // Also set the context class loader for the primordial thread.
        Thread.currentThread().setContextClassLoader(loader);

ClassLoader畢竟干了什么?

接下來一個較量重要的問題是ClassLoader畢竟干了什么?凡是我們只知道它加載了一個類進了jvm,可是詳細做了什么呢?

Java設計者把classloader加載一個類的進程分為4步:

  • 第一步,從某個處所獲得我們想要的字節碼二進制流;
  • 第二步,讀入字節碼流并轉化為Class;
  • 第三步,鏈接;
  • 第四步,初始化。
  • 個中,第二步一般較量牢靠,因此ClassLoader提供了defineClass來完成這步;

    protected final Class<?> defineClass(String name, byte[] b, int off, int len,
                                             ProtectionDomain protectionDomain)
            throws ClassFormatError
        {
            protectionDomain = preDefineClass(name, protectionDomain);
    
            Class c = null;
            String source = defineClassSourceLocation(protectionDomain);
    
            try {
                c = defineClass1(name, b, off, len, protectionDomain, source);
            } catch (ClassFormatError cfe) {
                c = defineTransformedClass(name, b, off, len, protectionDomain, cfe,
                                           source);
            }
    
            postDefineClass(c, protectionDomain);
            return c;
        }

    而 ClassLoader 提供了另一個要領 findClass 來完成第一步及第二步,即從某個處所讀入類的二進制流,然后挪用 defineClass 返回 Class

    protected Class<?> findClass(final String name)
             throws ClassNotFoundException

    ClassLoader提供了resolveClass要領完成第三步鏈接的事情。

    protected final void resolveClass(Class<?> c)

    除非非凡需要,不然只管重載 findClass 而不是 loadClass。

    loadClass 是 Java 1.0 就存在的類,圖紙加密,為了加強可擴展性,將findClass和resolveClass封裝到了loadClass中,一般我們只需要界說類的加載路徑,因此僅需包圍findClass。

    凡是我們顯示加載類一般會用到ClassLoader.loadClass、Class.forName,他們的區別見這里。

    resolveClass做了什么?

    resolveClass最終挪用了一個當處所法做link,這里的link主要做了這么幾步工作:

    1. 驗證Class以確保類裝載器名目和行為正確;
    2. 籌備后續步調所需的數據布局;
    3. 理會所引用的其他類。

    關于這些內容的詳細細節,請參考這里。

    ClassNotFoundException、NoClassDefFoundError、ClassCastException常見問題

    ClassNotFoundException一般產生在顯式類加載;NoClassDefFoundError一般產生在隱式加載;ClassCastException一般產生在jar包斗嘴,好比某個jar包已經被更上層的加載器加載了,但你卻要求他強制轉為基層加載器加載的同名類;

    鏈接的相關常識

    接下來講講鏈接的相關常識。

    為什么會發現鏈接器?

    最劈頭伐員寫措施都在一個文件里,跟著措施局限的增加,逐漸發明越來越難以維護,擴展。于是,分多個文件和模塊就成為一定。

    排列三305组选前后关系 上海11选五开奖官网 七星彩论坛 三码中奖期期公开1一 青海11选五最大遗漏号是 上海快3开奖结果查询-百度 极速飞艇APP 下载 双色球万能12码必中6 100万学百家乐的庄闲 彩票下载app送28 股票行情600415