程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 獲取類的class文件的絕對路徑

獲取類的class文件的絕對路徑

編輯:關於JAVA

在java中,經常要定位某些文件的位置,為了能讓程序與物理位置無關,就要使用相對路徑。但Java中使用相對路徑總會遇到一些很麻煩的問題,就是到底相對於哪個參照物的問題。因為我們平時使用相對路徑總是相對當前工作目錄而言的,但有時需求並非如此。比如,要在一個開發包中使用相對路徑,卻不知道開發包被其他程序調用時的所在路徑,而且特別是在web應用中,很難確定某個文件在整個應用中的相對路徑。

所以使用相對路徑最好的辦法就是讓路徑相對的參照物是我的開發包或我的應用本身的東西,最好的就是用我開發包中的類的class文件。只要知道了某個class文件的絕對路徑,就可以以它為參照物,使用相對路徑來定位其他任何文件了。

為了實現這個想法,我寫了這個Path類,這個類提供了兩個靜態公共方法,一個用來定位類的class文件的位置,另一個以某個類為參照物來定位一個相對路徑。使用這兩個方法,我們可以完全不必理會應用的當前工作路徑,隨心所欲的根據自己的位置來尋找任何文件。比如在編寫某個功能性開發包時,就可以完全不用管調用這個開發包的應用的路徑情況,而僅僅根據開發包本身的位置來定位文件,這樣很好的實現了封裝性,將文件的路徑處理完全封閉在了開發包自身之內。

以下是Path類的源代碼:

* 創建日期 2004-11-22 * * 更改所生成文件模板為 * 窗口 > 首選項 > Java > 代碼生成 > 代碼和注釋 */package mytools;

import java.io.File;import java.io.IOException;import java.net.MalformedURLException;import Java.Net.URL;import java.security.CodeSource;import Java.security.ProtectionDomain;

/** * @author 由月 * * 這個類提供了一些根據類的class文件位置來定位的方法。 */public class Path { /** * 獲取一個類的class文件所在的絕對路徑。 這個類可以是JDK自身的類,也可以是用戶自定義的類,或者是第三方開發包裡的類。 * 只要是在本程序中可以被加載的類,都可以定位到它的class文件的絕對路徑。 * * @param cls * 一個對象的Class屬性 * @return 這個類的class文件位置的絕對路徑。 如果沒有這個類的定義,則返回null。 */ public static String getPathFromClass(Class cls) throws IOException { String path = null; if (cls == null) { throw new NullPointerException(); } URL url = getClassLocationURL(cls); if (url != null) { path = url.getPath(); if ("jar".equalsIgnoreCase(url.getProtocol())) { try { path = new URL(path).getPath(); } catch (MalformedURLException e) { } int location = path.indexOf("!/"); if (location != -1) { path = path.substring(0, location); } } File file = new File(path); path = file.getCanonicalPath(); } return path; }

/** * 這個方法可以通過與某個類的class文件的相對路徑來獲取文件或目錄的絕對路徑。 通常在程序中很難定位某個相對路徑,特別是在B/S應用中。 * 通過這個方法,我們可以根據我們程序自身的類文件的位置來定位某個相對路徑。 * 比如:某個txt文件相對於程序的Test類文件的路徑是../../resource/test.txt, * 那麼使用本方法Path.getFullPathRelateClass("../../resource/test.txt",Test.class) * 得到的結果是txt文件的在系統中的絕對路徑。 * * @param relatedPath * 相對路徑 * @param cls * 用來定位的類 * @return 相對路徑所對應的絕對路徑 * @throws IOException * 因為本方法將查詢文件系統,所以可能拋出IO異常 */ public static String getFullPathRelateClass(String relatedPath, Class cls) throws IOException { String path = null; if (relatedPath == null) { throw new NullPointerException(); } String clsPath = getPathFromClass(cls); File clsFile = new File(clsPath); String tempPath = clsFile.getParent() + File.separator + relatedPath; File file = new File(tempPath); path = file.getCanonicalPath(); return path; }

/** * 獲取類的class文件位置的URL。這個方法是本類最基礎的方法,供其它方法調用。 */ private static URL getClassLocationURL(final Class cls) { if (cls == null) throw new IllegalArgumentException("null input: cls"); URL result = null; final String clsAsResource = cls.getName().replace('.', '/').concat( ".class"); final ProtectionDomain pd = cls.getProtectionDomain(); // Java.lang.Class contract does not specify // if 'pd' can ever be null; // it is not the case for Sun's implementations, // but guard against null // just in case: if (pd != null) { final CodeSource cs = pd.getCodeSource(); // 'cs' can be null depending on // the classloader behavior: if (cs != null) result = cs.getLocation();

if (result != null) { // Convert a code source location into // a full class file location // for some common cases: if ("file".equals(result.getProtocol())) { try { if (result.toExternalForm().endsWith(".jar") || result.toExternalForm().endsWith(".zip")) result = new URL("jar:".concat( result.toExternalForm()).concat("!/") .concat(clsAsResource)); else if (new File(result.getFile()).isDirectory()) result = new URL(result, clsAsResource); } catch (MalformedURLException ignore) { } } } }

if (result == null) { // Try to find 'cls' definition as a resource; // this is not // document.d to be legal, but Sun's // implementations seem to //allow this: final ClassLoader clsLoader = cls.getClassLoader(); result = clsLoader != null ? clsLoader.getResource(clsAsResource) : ClassLoader.getSystemResource(clsAsResource); } return result; }

public static void main(String[] args) { try { System.out.println(getPathFromClass(Path.class)); System.out.println(getFullPathRelateClass("../test/abc/..", Path.class)); } catch (Exception e) { e.printStackTrace(); } }}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved