【问题标题】:Detect whether Java class is loadable检测Java类是否可加载
【发布时间】:2009-11-10 01:39:05
【问题描述】:

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

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

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

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

有没有办法尝试加载一个类,如果它不起作用,然后做其他事情?本质上,我正在尝试捕获 ClassNotFound 异常,但还没有任何运气。

【问题讨论】:

    标签: java class dynamic classloader


    【解决方案1】:

    检查类是否存在的一种常用方法是执行 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();
      }
    } 
    

    【讨论】:

    • 这似乎正是我需要的,但我明天上班时需要尝试一下。预计明天早上的某个时间会被接受。谢谢!
    【解决方案2】:

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

    假设您在 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...
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2013-03-24
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2012-08-29
      相关资源
      最近更新 更多