2017-01-09 88 views
0

我试图在运行时从.jar文件启动应用程序。所以我跟着这个线程的代码: How to load a jar file at runtime尝试从.jar加载类时出现ClassCastException

,但我有此错误:

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)所需的罐子位于项目的lib/lib/文件夹中。我不知道如何解决这个问题。

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

任何帮助是值得欢迎的, 谢谢您的时间

+3

错误似乎在抱怨类'net.sf.latexdraw.LaTeXDraw'没有实现'Runnable'。那确实是这样吗?请注意,大多数Java应用程序的主类实际上并不实现“Runnable”。 –

+3

'Runnable'不是'LaTeXDraw'的*子类,是吗?不能,假设你指的是['java.lang.Runnable'](https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html)。 'asSubclass()'用于*下载*。如果'LaTeXDraw'实现了'Runnable',那将是一个上传,并且您不需要为'Class'投射,特别是考虑到作为接口的'Runnable'确实具有*构造函数。 – Andreas

+0

请分享LaTeXDraw类的类签名 –

回答

0

正如在评论中提到,你的问题很简单,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); 
//... 
+0

谢谢你的回答,这确实是我自己的一个愚蠢的错误。我会尽快回复,现在我更了解类加载的工作原理。 – LostReality

相关问题