是否可以检测Java中是否有类可用?

时间:2009-08-31 02:50:30

标签: java class

我希望能够做类似(伪代码)的事情:

if (classAvailable) {
    // do a thing
} else {
    // do a different thing
}

如果我可以从ClassA扩展一个类(如果可用)或ClassB(如果不可用),那么更好的是。我怀疑这是不可能的。

4 个答案:

答案 0 :(得分:6)

你可以做第一部分:

try {
    Class.forName("my.ClassName");
    // It is available
}
catch (ClassNotFoundException exception) {
    // It is not available
}

答案 1 :(得分:2)

我通常采用的方法是:

将使用可选库的代码分离到不同的源目录中。它应该实现接口,并且通常依赖于主源目录。

为了在构建中强制执行依赖项,编译主源目录而不使用可选库,然后编译依赖于可选库的源(使用其他源目录中的其他类文件和编译器类路径上的库)。

主要来源应该尝试动态加载可选源目录中的单个根类(Class.forNameasSubclassgetConstructornewInstance)。根类的静态intialiser应检查库是否真的可用,如果不是,则抛出异常。如果根类无法加载,则可能遵循Null对象模式。

答案 2 :(得分:1)

我认为没有办法动态选择是否扩展一个类或另一个类,除非你制作了一个可以直接操作字节码的程序(简单的例子:将子类的两个版本的编译后的字节码保存为字符串,只需使用ClassLoader加载与您可用的超类相对应的任何一个。

你可以用Python做到这一点; - )

答案 3 :(得分:0)

如果您使用的是Spring,请尝试使用org.springframework.util.ClassUtils#isPresent