2009-08-31 114 views
1

我希望能够做类似的信息(伪代码):是否有可能检测到Java中是否有类可用?

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

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

+1

什么意思是'available'?你是通过反射来加载它们吗? – 2009-08-31 02:53:19

+0

我正在为Android编写一个库。由于Android 1.5有一个名为AsyncTask的类,如果它可用,我想使用该类,否则我希望能够使用非本地类来执行相同的操作。我想更喜欢本地的,因为它会(可能)被维护。 – 2009-08-31 03:39:22

回答

1

我不认为有一种方式来动态地选择是否延长或那个阶级,但如果你犯了一个程序,可以直接操纵字节码(简单例如:将两个版本的子类的编译字节码保存为字符串,只需使用ClassLoader加载与您可用的超类相对应的任何一个)。

你能做到这一点在Python,虽然;-)

6

你可以做的第一部分:

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

如果它仍然试图静态引用它,它将无济于事...... – 2009-08-31 02:59:29

+1

如果类在编译时不可用,则静态'my.ClassName'引用将无法编译。如果班级“可能”或“不可能”可用,那么这是不行的。 – 2009-08-31 03:02:43

2

我通常的做法是这样的:

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

为了在构建中强制执行依赖关系,请编译不带可选库的主源代码目录,然后依赖可选库(源自其他源目录中的其他类文件和编译器类路径上的库) 。

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

0

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