动态加载终端中的java类

时间:2014-09-22 10:05:16

标签: java eclipse terminal classloader

该应用程序是模块化插件架构。也就是说,虽然工作是动态加载类。为此,自定义类加载器扩展了ClassLoader。

问题的实质是在Eclipse应用程序运行时,在终端(ubuntu)中使用以下代码行(其中目录“m /”表示模块的位置* .class):

java -jar ModularApp.jar m/

我收到以下消息:

  

10:07:24,085 DEBUG main CModuleLoader:findClass:39 - 运行System Classloader。   线程“main”中的异常java.lang.reflect.InvocationTargetException   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)   在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)   在java.lang.reflect.Method.invoke(Method.java:606)at   org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)   引起:java.lang.NoClassDefFoundError:ru / intetech / module / CModule   at java.lang.ClassLoader.defineClass1(Native Method)at   java.lang.ClassLoader.defineClass(ClassLoader.java:800)at   java.lang.ClassLoader.defineClass(ClassLoader.java:643)at   ru.intetech.moduleloader.CModuleLoader.findClass(CModuleLoader.java:35)   在java.lang.ClassLoader.loadClass(ClassLoader.java:425)at   java.lang.ClassLoader.loadClass(ClassLoader.java:358)at   ru.intetech.modularApp.Main.main(Main.java:42)... 5更多引起的:   java.lang.ClassNotFoundException:ru.intetech.module.CModule at   java.lang.ClassLoader.findClass(ClassLoader.java:531)at   ru.intetech.moduleloader.CModuleLoader.findClass(CModuleLoader.java:40)   在java.lang.ClassLoader.loadClass(ClassLoader.java:425)at   java.lang.ClassLoader.loadClass(ClassLoader.java:358)... 12更多

这是一段代码,用户类加载器(扩展ClassLoader),出现错误:

protected Class<?> findClass(String className) throws ClassNotFoundException
{
    try
    {
        byte b[]=getClassAsBytes(m_pathToBin+className+".class");
        return (defineClass(className, b, 0, b.length));
    }
    catch(FileNotFoundException ex)
    {
        m_log.debug("Run of the System Classloader.");
        return (super.findClass(className));
    }
    catch(IOException ex)
    {
        m_log.debug("Run of the Bootstrap.");
        return (super.findClass(className));
    }
}

可能是什么问题?

P.S。在本文的基础上实现的Loader: http://sysmagazine.com/posts/104229/

1 个答案:

答案 0 :(得分:0)

查看:堆栈跟踪显示消息“系统类加载器的运行”,这证明第一个捕获已执行。这是由FileNotFoundException引起的,它明显出现在getClassAsBytes方法中:这是您必须调查的内容:找出您要读取的文件(显示绝对路径的跟踪),以及为什么该文件不存在。

(最后,该catch块尝试通过系统类加载器加载所需的类,该类加载器无法访问该类,因此,它会抛出ClassNotFoundException。)