扩展可能不在类路径中的类

时间:2013-08-04 00:20:59

标签: java

我有一个类,它从程序包运行时可能包含在类路径中的包类扩展,除非满足相关性,否则不调用它, 但它似乎惹恼了java验证程序在尝试加载程序时抛出NoClassDefFoundError,

有什么方法吗?

3 个答案:

答案 0 :(得分:2)

  

有什么方法吗?

在实践中,没有。必须在类路径上提供超类才能成功加载,链接和验证子类。这必须在类初始化之前发生,并创建它的实例。


如果您无法确定超类是否可用,则需要删除子类上的所有直接和间接静态依赖项,然后使用Class.forName()动态加载子类。如果超类“丢失”,那将失败,但是你会得到一个不同的异常(不是Error),如果它的设计是为了应对缺少的类,你的应用程序可能会继续。< / p>

答案 1 :(得分:0)

Spring等具有“可选使用”代码的框架,取决于其他库,使用“策略模式”将特定于依赖项的代码放入“内部类”或单独的类中。

外部类可以加​​载&amp;好的;只有当你尝试&amp; 实例化将抛出NoClassDefFoundError的内部类。

因此外部类通常尝试(try-catch)实例化一个要使用的策略,然后如果失败则实例化后备策略。

public class MyService {
    protected MyStrategy strategy;

    // constructor;
    //    -- choose our strategy.
    public MyService() {
        try {
            this.strategy = new ExternalLib_Strategy();
        } catch (NoClassDefFoundError x) {
            // external library not available.
            this.strategy = new Standard_Strategy ();
        }
    }

    // --------------------------------------------------------

    protected interface MyStrategy {
        public void doSomething();
    }

    protected static class ExternalLib_Strategy implements MyStrategy {
        ExternalLib lib = org.thirdparty.ExternalLib.getInstance();   // linkage may
        public void doSomething() {
            // ... use the library for additional functionality.
        }
    }

    protected static class Standard_Strategy {
        public void doSomething() {
            // ... basic/ fallback functionality.
        }
    }

}

答案 2 :(得分:0)

作为解决此问题的方法,如果您的类(子类)在类路径中可用,则可以使用方法{{1}通过将类文件作为资源加载来检查类路径中是否可用父类。 }。此方法永远不会抛出未找到的类异常。但是如果找不到类,这将返回null。如果资源为空,您可以使用您的类进行aviod。

请参阅以下示例代码:

ClassLoader.getResource()

}