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("/"));
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值