是否有可能检测到Java中是否有类可用?
我希望能够做类似的信息(伪代码):是否有可能检测到Java中是否有类可用?
if (classAvailable) {
// do a thing
} else {
// do a different thing
}
什么是更好的是,如果我可以从ClassA的扩展类(如果可用)或ClassB的,如果不是。我怀疑这是不可能的。
我不认为有一种方式来动态地选择是否延长或那个阶级,但如果你犯了一个程序,可以直接操纵字节码(简单例如:将两个版本的子类的编译字节码保存为字符串,只需使用ClassLoader
加载与您可用的超类相对应的任何一个)。
你能做到这一点在Python,虽然;-)
你可以做的第一部分:
try {
Class.forName("my.ClassName");
// It is available
}
catch (ClassNotFoundException exception) {
// It is not available
}
如果它仍然试图静态引用它,它将无济于事...... – 2009-08-31 02:59:29
如果类在编译时不可用,则静态'my.ClassName'引用将无法编译。如果班级“可能”或“不可能”可用,那么这是不行的。 – 2009-08-31 03:02:43
我通常的做法是这样的:
分离出来,它使用可选库到不同的源目录中的代码。它应该实现接口并且通常依赖于主源目录。
为了在构建中强制执行依赖关系,请编译不带可选库的主源代码目录,然后依赖可选库(源自其他源目录中的其他类文件和编译器类路径上的库) 。
主要来源应该试图在动态的可选的源目录(Class.forName
,asSubclass
,getConstructor
,newInstance
)加载一个根类。根类的静态intialiser应检查该库是否真的可用,如果不是,则会抛出异常。如果根类无法加载,则可能遵循空对象模式。
如果您使用的是Spring,请尝试使用org.springframework.util.ClassUtils#isPresent
什么意思是'available'?你是通过反射来加载它们吗? – 2009-08-31 02:53:19
我正在为Android编写一个库。由于Android 1.5有一个名为AsyncTask的类,如果它可用,我想使用该类,否则我希望能够使用非本地类来执行相同的操作。我想更喜欢本地的,因为它会(可能)被维护。 – 2009-08-31 03:39:22