检测Java类是否可加载

时间:2009-11-10 01:39:05

标签: java class dynamic classloader

我有两个程序:一个CLI程序和一个GUI。 GUI是CLI的前端,也是另一个程序的GUI。

我正在导入CLI的类并在GUI中扩展它们以向类添加GUI元素,一切都很棒。

但是现在我想拆分我目前嵌入GUI的CLI(作为一个包含的JAR)。 JAR位于一个固定的位置(/opt/program/prog.jar),应用程序只能在Linux上使用,所以我意识到这会破坏传统的Java思想。

我已在Manifest文件中编辑了ClassPath以反映此更改,并且它工作正常。但是,当我删除文件时,GUI无法加载,因为无法加载该类。

有没有办法尝试加载一个类,如果它不起作用,那么再做一些其他的事情?本质上,我试图捕获ClassNotFound异常,但还没有运气。

2 个答案:

答案 0 :(得分:6)

检查类存在的一种常用方法是只执行Class.forName(“my.Class”)。您可以使用捕获ClassNotFoundException并决定要执行的try / catch来包装它。如果需要,可以在包含main()的包装类中执行此操作。您可以尝试加载该类,如果成功,则在已加载的类上调用main(),如果没有,则执行其他操作。

public static void main(String arg[]) {
  try { 
    Class.forName("my.OtherMain");

    // worked, call it
    OtherMain.main();
  } catch(ClassNotFoundException e) {
    // fallback to some other behavior
    doOtherThing();
  }
} 

答案 1 :(得分:1)

  

有没有办法尝试加载一个类,如果它不起作用,那么再做一些其他的事情?

假设您在C:\中有一个类文件,名为Foo.class

public static void main(String[] args) {

    File f = new File("c:\\");
    if (f.exists()) {
        URLClassLoader CLoader;
        try {
            CLoader = new URLClassLoader(new URL[]{f.toURL()});
            Class loadedClass = CLoader.loadClass("Foo");
        } catch (ClassNotFoundException ex) {
        } catch (MalformedURLException ex) {
        }

    } else {
        //do something else...
    }

}