eclipse中使用反射機制時應該注意的問題


        使用反射機制獲取類的代碼如下:

		Class.forName("Tester");
        其中,Tester是一個同包下的類,我在eclipse中運行時,始終報ClassNotFound異常,代碼也檢查了N遍,沒有問題,最后,我在cmd環境下運行,一切OK,這個時候也郁悶了,怎么回事。

        后來在查資料的過程中,想起了在JDBC總運用反射獲取驅動的代碼:

		Class.forName("com.mysql.jdbc.Driver");
難道是需要寫入完整的類路徑,包括前面的包名稱,后來改成如下的代碼:

		Class.forName("org.xn.chapter18.demo.Tester");
        OK,一切正常,看來Java的反射機制還是必須通過classpath配置的路徑來查找類,如果在cmd中運行,由於是在當前目錄下所以運行一切正常,所以這說明eclipse在運行java程序的時候,並不似從當前包的路徑下運行的,那么是從那個地方發運行的呢?

        為了查清這個問題,我添加了一個getRoot()方法來獲取當前工作的目錄名稱:

	public void getRoot() {
		//獲取當前工作的根目錄
		System.out.println(getClass().getResource("/"));
	}
運行的結果是:“  file:/X:/demo1/CrazyJava/bin/  ”,這個時候我將編譯好的Tester.class文件放在運行結果所示的目錄下面,再將代碼改回Class.forName("Tester");,在eclipse下面運行,一切正常。

        下面貼上完整的代碼,包含詳細注釋:

package org.xn.chapter18.demo;

class Tester {
	static {
		System.out.println("Tester類的靜態塊...");
	}
}

public class ClassLoaderTest {
	public static void main(String[] args) throws ClassNotFoundException{
		ClassLoader cl = ClassLoader.getSystemClassLoader();
		//下面與的兩個語句總必須把類的完整路徑寫出來,
		//否則直接報“ClassNotFoundException”異常
		//下面的語句僅僅是加載Tester類
		cl.loadClass("org.xn.chapter18.demo.Tester");
		System.out.println("系統加載Tester類");
		//下面語句才會初始化Tester類
		Class.forName("org.xn.chapter18.demo.Tester");
		// 以下的代碼顯示了當前運行的目錄
		//這里我們發現了原因,eclipse在運行java程序時
		//並不是在“org.xn.chapter18.demo”這個包下運行的
		//而是在X:/demo1/CrazyJava/bin/這個目錄下運行的
		//為了試驗這個結果,我將編譯后的Tester.class文件
		//放在了X:/demo1/CrazyJava/bin/目錄下,這個時候
		//再改回Class.forName("Tester");運行正常。
		ClassLoaderTest c = new ClassLoaderTest();
		c.getRoot();
	}
	
	public void getRoot() {
		//獲取當前工作的根目錄
		System.out.println(getClass().getResource("/"));
	}
}






注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com