skip to main
|
skip to sidebar
小虫玩電腦
2009-05-04
如何取得 class 的實體位置
通常,我們的開發環境與部署環境多多少少會有些不同,而我們開發測試完成後,進行部署時,有時候會有一些 method 找不到的問題,這個時候我們可能就需要找到某個 class 到底是不是我們部署的檔案,底下這個 class 是我從網路上找來的,用它就可以快速找到 class 的實體路徑了。
import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.security.CodeSource; import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; public class Path { /** * 獲取一個類的class文件所在的絕對路徑。 這個類可以是JDK自身的類,也可以是用戶自定義的類,或者是第三方開發包裡的類。 * 只要是在本程序中可以被加載的類,都可以定位到它的class文件的絕對路徑。 * * @param cls * 一個對象的Class屬性 * @return 這個類的class文件位置的絕對路徑。 如果沒有這個類的定義,則返回null。 */ public static String getPathFromClass(Class cls) { 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); try { path = file.getCanonicalPath(); } catch (IOException ex) { Logger.getLogger(Path.class.getName()).log(Level.SEVERE, null, ex); } } 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) { 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); try { path = file.getCanonicalPath(); } catch (IOException ex) { Logger.getLogger(Path.class.getName()).log(Level.SEVERE, null, ex); } 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; } }
沒有留言:
張貼留言
較新的文章
較舊的文章
首頁
訂閱:
張貼留言 (Atom)
分類
軟體
(12)
單車
(2)
程式
(4)
網路
(6)
環島
(1)
adblock
(1)
android
(2)
Cloud
(1)
css
(1)
Database
(2)
dot net
(1)
eclipse
(2)
git
(1)
groovy
(1)
html
(1)
ios
(5)
ipad
(1)
iphone
(1)
java
(23)
Javascript
(3)
jquery
(1)
Linux
(4)
mac
(4)
network
(1)
Oracle
(1)
safari
(1)
svn
(1)
test
(1)
titanium
(1)
USB、病毒
(1)
virtualbox
(1)
vnc
(1)
vpn
(1)
web
(1)
Windows
(12)
xcode
(1)
xp
(1)
每月文章彙集
►
2022
(4)
►
4月
(1)
►
3月
(1)
►
1月
(2)
►
2020
(1)
►
3月
(1)
►
2019
(1)
►
6月
(1)
►
2018
(2)
►
10月
(1)
►
1月
(1)
►
2014
(5)
►
9月
(2)
►
7月
(1)
►
3月
(1)
►
1月
(1)
►
2013
(2)
►
2月
(1)
►
1月
(1)
►
2012
(4)
►
11月
(1)
►
7月
(1)
►
6月
(1)
►
3月
(1)
►
2011
(9)
►
9月
(4)
►
8月
(1)
►
6月
(1)
►
1月
(3)
▼
2009
(37)
►
9月
(1)
►
8月
(2)
►
6月
(5)
▼
5月
(3)
如何以 command 來更改螢幕解析度
執行 ant 發生 out of memory
如何取得 class 的實體位置
►
4月
(6)
►
3月
(6)
►
2月
(7)
►
1月
(7)
►
2008
(32)
►
12月
(21)
►
10月
(2)
►
9月
(2)
►
8月
(3)
►
3月
(4)
►
2005
(2)
►
9月
(2)
►
2004
(1)
►
12月
(1)
關於小蟲
小虫
檢視我的完整簡介
追蹤者
沒有留言:
張貼留言