【问题标题】:ClassCastException when trying to load a class from a .jar尝试从 .jar 加载类时出现 ClassCastException
【发布时间】:2017-05-24 00:40:37
【问题描述】:

我正在尝试在运行时从 .jar 文件启动应用程序。所以我按照这个线程中的代码: How to load a jar file at runtime

但我遇到了这个错误:

Exception in thread "main" java.lang.ClassCastException: class net.sf.latexdraw.LaTeXDraw
    at java.lang.Class.asSubclass(Unknown Source)
    at LatexLauncher.<init>(LatexLauncher.java:17)
    at LatexLauncher.main(LatexLauncher.java:26)

这是代码,与上面的线程完全相同:

File path = new File("pathToMyJAR/lib/LaTeXDraw.jar");
System.out.println(path.exists()); //return true
ClassLoader loader = URLClassLoader.newInstance(
        new URL[] { path.toURI().toURL() },
        getClass().getClassLoader()
);
Class<?> clazz = Class.forName("net.sf.latexdraw.LaTeXDraw", true, loader);
Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class);
Constructor<? extends Runnable> ctor = runClass.getConstructor();
Runnable doRun = ctor.newInstance();
doRun.run();

LatexLauncher 构造函数中的上述代码。抛出错误的行是:

Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class);

这是一个 Eclipse 项目,我要运行的 .jar 文件位于 lib 文件夹中。我要运行的(LaTeXDraw)所需的 jar 位于项目的 lib/lib/ 文件夹中。我不知道如何解决这个问题。

我的最终目标是启动 .jar 应用程序并让 Robot 类在 UI 上执行操作以进行测试。

欢迎任何帮助, 感谢您的宝贵时间

【问题讨论】:

  • 错误似乎是在抱怨net.sf.latexdraw.LaTeXDraw 类没有实现Runnable。真的是这样吗?请注意,大多数 Java 应用程序的主类确实没有实现 Runnable
  • Runnable 不是LaTeXDraw子类,是吗?不可能,假设您指的是java.lang.RunnableasSubclass() 用于向下转换。如果LaTeXDraw 实现Runnable,那将是一个向上转换,并且您不需要为此转换Class,特别是考虑到Runnable 作为一个接口,实际上具有 一个构造函数。
  • 请分享 LaTeXDraw 类的类签名
  • 感谢您的所有反馈,我只是从线程中复制粘贴代码而不理解它。你们都说得更清楚了!

标签: java eclipse jar classloader


【解决方案1】:

正如 cmets 中所述,您的问题只是 net.sf.latexdraw.LaTeXDraw 没有实现 Runnable。我真的不知道你期待发生什么。

让您的 Robot 类实现 Runnable 并在其中使用 LaTeXDraw

public class Robot implements Runnable
{
    @Override
    public void run()
    {
       LaTeXDraw thing = new LaTeXDraw(); // or whatever
       //...
    }
}

//...
Class<?> clazz = Class.forName("package.Robot", true, loader);
Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class);
//...

【讨论】:

  • 感谢您的回答,这确实是我自己犯的一个愚蠢的错误。我会尽快返回,现在我对类加载的工作原理有了更多了解。
猜你喜欢
  • 2017-09-02
  • 2017-07-08
  • 2019-03-18
  • 2019-09-08
  • 2012-01-18
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多