2011-11-30 120 views
1

我想在java项目中运行外部Java项目(类)。我不是指任何程序(例如EXE文件),而是java类(项目)。运行外部java类(项目)

让考虑你有类文件路径的字符串:

String = "C:\\test\\test.class"; 

回答

0

“跑”另一个Java程序通过调用它的主要方法完成。假设你有类net.tilialacus.TheProg要运行,那么你可以做(​​在其他Java程序)

String[] args = {"arg1", "arg2"}; 
net.tilialacus.TheProg.main(args); 

或通过反射类是否在编译时不知道:

Class<?> theClass = Class.forName("net.tilialacus.TheProg"); 
    Method method = theClass.getDeclaredMethod("main", String[].class); 
    String[] args = { "arg1", "arg2"}; 
    method.invoke(null, (Object)args); 

当然,如果该类不存在或者没有“public static main(String [])”方法,则需要处理异常。

+0

Lindsjo让说我有一个项目例1和它的主类例1:如果你有,你想要实例/使用磁盘外部.class文件,那么一旦你知道了可用的API是相对简单的。类。 如何从我的java程序构建和运行这个? 你有什么想法吗? – 100798

+0

@ 100798该类是否已经在类路径中?所以你应该能够使用我上面展示的内容。如果没有,那么你必须通过类加载器加载它(参见craig的答案)。你有哪个部分有问题? –

2

除了你的非常喜欢的语气,它好像你想要某种插件结构。

基本上,你需要一个ClassLoader这将加载你想要的类/库。一旦他们被加载,你可以使用它们。

也许这可以帮助你:How to load a jar file at runtime

4

这是ClassLoader的责任。

File f = ...; // Folder containing the .class files 

ClassLoader loader = new URLClassLoader(new URL[] { f.toURI().toURL() }, getClass().getClassLoader();); 
for (File classFile : f.listFiles(new FilenameFilter() { 
    public boolean accept(File dir, String name) { 
     return name.endsWith(".class"); 
    } 
})) { 
    try { 
     String filename = classFile.getName(); 
     // Remove the .class extension 
     Class<?> cls = loader.loadClass(filename.substring(0, filename.length() - 6)); 
     // Do something with the class 
    } catch (Exception ex) { 
     LOGGER.error("Unable to load plugin: " + ex.getMessage()); 
    } 
} 
+0

你的例子似乎是更一般的情况。考虑最简单的例子,假设你有一个字符串String =“C:\\ .. \\ test.class”中的类文件路径。现在如何运行(加载)它。 – 100798

+0

...你读过这个代码吗?实际上,第一行是您必须编写的唯一一个使其按照您想要的方式工作的行。有没有什么特别的东西会遇到麻烦?如果你只希望它加载一个特定的文件,那么你可以(如果你想要一个单行的改变)改变'FilenameFilter'只为你的“test.class”情况返回true。 –

+0

是的,但它不起作用。文件名保留字符串中文件夹的所有类。即使有一个.class文件,它也不会执行任何操作。没有加载该类。防爆。我在该文件夹上有一个简单的GUI程序,但它不加载。更甚者,不会出现错误。 – 100798