【发布时间】:2012-10-03 18:13:16
【问题描述】:
结合来自该站点上的许多帖子和许多其他帖子的信息,我得到了以下代码来动态添加(在运行时)一个包含类的目录到类路径并在该目录中加载一个类。
我正在使用 OSGi 包并从 Eclipse 运行“Eclipse 应用程序”(一种运行配置)。
这是我正在使用的代码:
CASE 1:(这两种情况是不同的事情,我试图做同样的事情。)
File file = new File("/Users/alek/fastFIX/myJPass/");
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("GuiLauncher"); //the file GuiLauncher.class is in the /Users/alek/fastFIX/myJPass/ directory
Class[] argTypes = new Class[] { String[].class };
Method main = cls.getDeclaredMethod("main", argTypes); //trying to run the main class
main.invoke(null, (Object) args);
我没有收到任何错误,也没有任何反应。 我还尝试了以下方法,因为我实际上需要加载的类与其他(已经加载的)类进行交互。
案例 2:
ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { new File("/Users/alek/fastFIX/myJPass/").toURL() }, currentThreadClassLoader);
Thread.currentThread().setContextClassLoader(urlClassLoader);
然后我像这样加载:
Class<?> c = Class.forName("GuiLauncher");
或者像这样:
Class<?> c = Thread.currentThread().getContextClassLoader().loadClass("GuiLauncher");
并尝试像这样调用主函数:
Class[] argTypes = new Class[] { String[].class };
Method main = cls.getDeclaredMethod("main", argTypes); //trying to run the main class
main.invoke(null, (Object) args);
这里也没有任何反应。
对可能发生的事情有任何线索吗?我已经阅读了这里的所有相关帖子以及其他许多地方都没有运气。
【问题讨论】:
-
为了记录,在动态加载的对象上调用方法更简单的方法是让它们实现已知的接口。
MyPlugin m = cls.newInstance(); m.runPlugin(magic, hax);其中 MyPlugin 是您的运行时类实现的接口。 -
你写了“Class.forName("GuiLauncher");”。您的课程在默认包中吗?可能你类的文件夹和包声明不匹配?
-
如果您在执行类加载器之前引用了
GuiLauncher类,它会被默认类加载器从类路径加载。因此,在这种情况下,您的loadClass不会产生任何影响,因为它会检查父类加载器以查看它是否已加载并发现它已加载。 -
@Wug:我无法访问我正在加载的类的代码。
-
@basiljames,我以前没有这样做过。在任何情况下,如果类已经加载,则应该运行 main 方法。如果我错了,请纠正我。
标签: java eclipse dynamic osgi classpath