1. 程式人生 > >類載入器工具類:動態設定classpath,獲得載入類列表等

類載入器工具類:動態設定classpath,獲得載入類列表等

下面的一個小工具類提供了對系統類載入器和擴充套件類載入器的動態控制能力.
可以在程式中加入classpath,當然也可以獲得類載入器載入的類列表,相信
java的動態能力!


package org.rut.core;

import java.io.File;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;

import org.rut.RootException;

import sun.misc.Launcher;

/**
 * @author treeroot
 * @since 2006-2-12
 * @version 1.0
 */
public class ClassLoaderUtil {
    private static Field classes;

    private static Method addURL;
    static {
        try {
            classes = ClassLoader.class.getDeclaredField("classes");
            addURL = URLClassLoader.class.getDeclaredMethod("addURL",
                    new Class[] { URL.class });
        } catch (Exception e) {
            //won't happen ,but remain it
            throw new RootException(e);
        }
        classes.setAccessible(true);
        addURL.setAccessible(true);
    }

    private static URLClassLoader system = (URLClassLoader) getSystemClassLoader();

    private static URLClassLoader ext = (URLClassLoader) getExtClassLoader();

    public static ClassLoader getSystemClassLoader() {
        return ClassLoader.getSystemClassLoader();
    }

    public static ClassLoader getExtClassLoader() {
        return getSystemClassLoader().getParent();
    }

    /**
     * 獲得載入的類
     *
     * @return
     */
    public static List getClassesLoadedBySystemClassLoader() {
        return getClassesLoadedByClassLoader(getSystemClassLoader());
    }

    public static List getClassesLoadedByExtClassLoader() {
        return getClassesLoadedByClassLoader(getExtClassLoader());
    }

    public static List getClassesLoadedByClassLoader(ClassLoader cl) {
        try {
            return (List) classes.get(cl);
        } catch (Exception e) {
            throw new RootException(e);
        }
    }

    public static URL[] getBootstrapURLs() {
        return Launcher.getBootstrapClassPath().getURLs();
    }

    public static URL[] getSystemURLs() {
        return system.getURLs();
    }

    public static URL[] getExtURLs() {
        return ext.getURLs();
    }

    private static void list(PrintStream ps, URL[] classPath) {
        for (int i = 0; i < classPath.length; i++) {
            ps.println(classPath[i]);
        }
    }

    public static void listBootstrapClassPath() {
        listBootstrapClassPath(System.out);
    }

    public static void listBootstrapClassPath(PrintStream ps) {
        ps.println("BootstrapClassPath:");
        list(ps, getBootstrapClassPath());
    }

    public static void listSystemClassPath() {
        listSystemClassPath(System.out);
    }

    public static void listSystemClassPath(PrintStream ps) {
        ps.println("SystemClassPath:");
        list(ps, getSystemClassPath());
    }

    public static void listExtClassPath() {
        listExtClassPath(System.out);
    }

    public static void listExtClassPath(PrintStream ps) {
        ps.println("ExtClassPath:");
        list(ps, getExtClassPath());
    }

    public static URL[] getBootstrapClassPath() {
        return getBootstrapURLs();
    }

    public static URL[] getSystemClassPath() {
        return getSystemURLs();
    }

    public static URL[] getExtClassPath() {
        return getExtURLs();
    }

    public static void addURL2SystemClassLoader(URL url) {
        try {
            addURL.invoke(system, new Object[] { url });
        } catch (Exception e) {
            throw new RootException(e);
        }
    }

    public static void addURL2ExtClassLoader(URL url) {
        try {
            addURL.invoke(ext, new Object[] { url });
        } catch (Exception e) {
            throw new RootException(e);
        }
    }

    public static void addClassPath(String path) {
        addClassPath(new File(path));
    }

    public static void addExtClassPath(String path) {
        addExtClassPath(new File(path));
    }

    public static void addClassPath(File dirOrJar) {
        try {
            addURL2SystemClassLoader(dirOrJar.toURL());
        } catch (MalformedURLException e) {
            throw new RootException(e);
        }
    }

    public static void addExtClassPath(File dirOrJar) {
        try {
            addURL2ExtClassLoader(dirOrJar.toURL());
        } catch (MalformedURLException e) {
            throw new RootException(e);
        }
    }

}

相關推薦

載入工具:動態設定classpath,獲得載入列表

下面的一個小工具類提供了對系統類載入器和擴充套件類載入器的動態控制能力.可以在程式中加入classpath,當然也可以獲得類載入器載入的類列表,相信java的動態能力! package org.rut.core; import java.io.File;import java

Java載入( CLassLoader ) 死磕 6: 自定義網路載入

【正文】Java類載入器(  CLassLoader ) 死磕 6:  自定義網路類載入器 本小節目錄 6.1. 自定義網路類載入器的類設計 6.2. 檔案傳輸Server端的原始碼 6.3. 檔案傳輸Client端的原始碼 6. 4 自定義載入器SocketClassLoader的原始

十、JAVA多執行緒:JVM載入(自動載入、雙親委託機制、載入名稱空間、執行時包、的解除安裝

  Jvm提供了三大內建的類載入器,不同的類載入器負責將不同的類載入到記憶體之中 根載入器(Bootstrap ClassLoader) 是最頂層的載入器,是由C++編寫的,主要負責虛擬機器核心類庫的載入,如整個java.lang包,根載入器是獲取不到引用的,因此

tomcat載入找不到jar包中的問題分析與解決思路

我們忽略了tomcat內部自定義的類載入器只想到了JVM的那幾個載入器,tomcat有個叫webApp的載入器它是先載入WEB-INF/classes後在載入WEB-INF/lib,但它的父載入器是它的common載入器,comon的父載入器是system載入器(和JVM的應用程式載入器功能差不多,不過指定了

面試官:談談載入吧,你有沒有看過載入的原始碼

一、類載入 1.1、在java程式碼中,型別的載入,連線,初始化過程都是在程式執行期間完成的。 圖示: 1.2、型別的載入——這裡的型別是指的什麼? 答:型別就是指的我們Java原始碼通過編譯後的class檔案。 1.3、型別的來源有哪些? (1)本地磁碟 (2)網路下載,class檔案 (3)war,ja

動態連結庫中新增和資源-並訪問動態連結庫中的和資源

1#define  EXPORTDLL _declspec(dllimport); //定義一個巨集EXPORTDLL class CShowDlg{ public:  virtual void _stdcall ShowNote(char *pszText)//客戶端想要訪

JavaEE複習回顧十一: (基礎加強) 載入 && 註解 && 動態代理

參考文章: 1,動態代理——從一竅不通到恍然大悟 2,UML類圖與類的關係詳解   一,類載入器 1.1 什麼是類載入器,作用是什麼? 一個自己編寫的 Java 程式碼原始檔,起執行的過程主要分為三個階段。 第一個階段: SOURCE 級別,即原始碼階段,已

載入|註解|動態代理

一、類載入器 1.什麼是類載入器,作用是什麼? 類載入器就載入位元組碼檔案(.class)   2.類載入器的種類   類載入器有三種,不同類載入器載入不同的 1)BootStrap:引導類載入器:載入都是最基礎的檔案 2)ExtClassLoader:擴充套件類載入器:載入都是基

載入(Mapper動態代理)和反射

類的載入:        當程式要使用某個類時,如果該類還未被載入到記憶體中,則系統會通過載入,連線,初始化三步來實現對這個類進行初始化。    一:載入             就是指將class檔案讀入記憶體,併為之建立一個Class物件。            任何類被

JAVA載入、註解和動態代理

一.類載入器 1.什麼是類載入器,作用是什麼 類載入器就載入位元組碼檔案(.class) 2.類載入器的種類 類載入器有三種,不同載入器載入不同 BootStrap:引導類載入器:載入都是最基礎的檔案 ExtClassLoader:擴充套

Java動態載入(載入外部jar包 讀取資原始檔)

Code: package xx.xx.xx import java.io.IOException; import java.io.InputStream; import java.util.jar.JarEntry; import java.util.jar.JarFi

java載入動態代理

import java.lang.reflect.*; import java.util.ArrayList; import java.util.Collection; public class ProxyTest { public static void main(String[] args) throw

java載入——ClassLoader

web rac rgb 好的 全盤負責機制 安全 trac 字節 如何 Java的設計初衷是主要面向嵌入式領域,對於自己定義的一些類,考慮使用依需求載入原則。即在程序使用到時才載入類,節省內存消耗,這時就可以通過類載入器來動態載入。 假設你平時僅僅是做web開發,那應該

載入指定包名下的全部類或依據的annotation進行過濾的工具

指定 -a art 依據 包名 data scrip 進行 ack 載入指定包名下的全部類或依據類的annotation進行過濾的工具類

CSS3----動態選擇

選擇 :focus orange ted link gre color img .com 5 1、link:超連接在沒被點擊之前的狀態; a:link{ color: red; } 2、visited:超鏈接在被點擊後的狀態;

Java載入 ClassLoader的解析

index html dir obj ble body 6.4 odin 普通 //參考 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 類載入器基本概念 類載

多線程控制工具--倒計時CountDownLatch的使用(模仿火箭發射)

-- nbsp sys inter 線程池 main except import 計時 package com.thread.test.Lock; import java.util.Random; import java.util.concurrent.CountDow

finalkeyword對JVM載入的影響

public fin port args stat gpo sys tint () 眾所周知,當訪問一個類的變量或方法的時候。假設沒有初始化該類。就會先去初始化一個類 可是,當這個類的變量為final的時候,就

使用動態選擇美化按鈕

狀態 type add rgba offset 文字 auto text back <!doctype html><html><head><meta charset="utf-8"><title>使用動態偽類選擇器