我希望能够做类似(伪代码)的事情:
if (classAvailable) {
// do a thing
} else {
// do a different thing
}
如果我可以从ClassA扩展一个类(如果可用)或ClassB(如果不可用),那么更好的是。我怀疑这是不可能的。
答案 0 :(得分:6)
你可以做第一部分:
try {
Class.forName("my.ClassName");
// It is available
}
catch (ClassNotFoundException exception) {
// It is not available
}
答案 1 :(得分:2)
我通常采用的方法是:
将使用可选库的代码分离到不同的源目录中。它应该实现接口,并且通常依赖于主源目录。
为了在构建中强制执行依赖项,编译主源目录而不使用可选库,然后编译依赖于可选库的源(使用其他源目录中的其他类文件和编译器类路径上的库)。
主要来源应该尝试动态加载可选源目录中的单个根类(Class.forName
,asSubclass
,getConstructor
,newInstance
)。根类的静态intialiser应检查库是否真的可用,如果不是,则抛出异常。如果根类无法加载,则可能遵循Null对象模式。
答案 2 :(得分:1)
我认为没有办法动态选择是否扩展一个类或另一个类,除非你制作了一个可以直接操作字节码的程序(简单的例子:将子类的两个版本的编译后的字节码保存为字符串,只需使用ClassLoader
加载与您可用的超类相对应的任何一个。
你可以用Python做到这一点; - )
答案 3 :(得分:0)
如果您使用的是Spring,请尝试使用org.springframework.util.ClassUtils#isPresent