至于学术目的的HTTP Web服务器项目, 我试着写了Web应用的类我自己的自定义类加载器的一部分,但似乎无法做对了。爪哇 - 定制ClassLoader - 尝试使用类文件的完整路径加载类
一般来说,Web应用程序都位于自己的文件夹,Web应用程序的“.class”的文件是相同的,因为它是直接父文件夹的名称。 (例如Web1/Web1.class)。 下面的代码运行正常,直到我到达defineClass()
方法,然后将它抛出我与以下异常:
java.io.FileNotFoundException: C:\inetpub\javawwwroot\WebApps\java\lang\Object\.Object.class (The system cannot find the path specified)
这是很值得一提的是C:\inetpub\javawwwroot\WebApps\
部分等于m_WebAppsFullPath
变量在下面的代码。
此外,试图用
InputStream in = getResourceAsStream(clsFile);
,而不是InputStream in = new FileInputStream(clsFile);
我得到一个空的返回值...
UPDATE时:总之,我怎么能加载一个特定的类不在“CLASSPATH”中,也不在我项目的任何包中?
protected synchronized Class loadClass(String className, boolean resolve)
throws ClassNotFoundException
{
log("Loading class: " + className + ", resolve: " + resolve);
// 1. is this class already loaded?
Class cls = findLoadedClass(className);
if (cls != null)
{
return cls;
}
// 2. get class file name from class name
String classRelativePath = className.replace('.', '/');
String classFileName =
((className.lastIndexOf('.') != -1) ? className.substring(className.lastIndexOf('.')) : className) + ".class";
String clsFile = m_WebAppsFullPath + "\\" + classRelativePath + "\\" + classFileName;
// 3. get bytes for class
byte[] classBytes = null;
try
{
//InputStream in = getResourceAsStream(clsFile);
InputStream in = new FileInputStream(clsFile);
byte[] buffer = new byte[BUFFER_SIZE];
ByteArrayOutputStream out = new ByteArrayOutputStream();
int n = -1;
while ((n = in.read(buffer, 0, BUFFER_SIZE)) != -1) {
out.write(buffer, 0, n);
}
classBytes = out.toByteArray();
}
catch (IOException e) {
log("ERROR loading class file: " + e);
}
if (classBytes == null) {
throw new ClassNotFoundException("Cannot load class: " + className);
}
// 4. turn the byte array into a Class
try {
cls = defineClass(className, classBytes, 0, classBytes.length);
if (resolve) {
resolveClass(cls);
}
}
catch (SecurityException e) {
// loading core java classes such as java.lang.String
// is prohibited, throws java.lang.SecurityException.
// delegate to parent if not allowed to load class
cls = super.loadClass(className, resolve);
}
return cls;
}
任何想法我怎么能得到它的工作?
谢谢!
这将有助于如果你能展现完整的异常堆栈跟踪。 – 2011-08-17 12:33:48
`... \对象\ .Object.class`确保你不想`... \ Object.class` – vickirk 2011-08-17 12:50:49