为了安排作业的执行,我得到一个类的名称作为字符串输入.
这个类可能是两个包中的一个,但我不知道哪一个,所以我必须检查这个.
到现在为止,我有两个try-catch-blocks
Class<Job> clazz;
String className; //the above mentioned string, will be initialized
try {
clazz = (Class<Job>) Class.forName("package.one." + className);
} catch (ClassNotFoundException ex) {
try {
clazz = (Class<Job>) Class.forName("package.two." + className);
} catch (ClassNotFoundException ex1) {
//some error handling code here, as the class is
//in neither of the two packages
}
}
Run Code Online (Sandbox Code Playgroud)
对于更多的包,这将变得更加丑陋,更难以理解.此外,对我而言,它违背了例外的概念,因为异常不应该被预期/用于流量控制!
有没有办法在不使用的情况下重写这个ClassNotFoundException?
我坚持这个Class.forName方法.
您可以将类和包名称存储在Collections或Sets中,并循环遍历这些元素.当你得到一个ClassNotFoundException,你只需继续搜索.如果你没有得到异常,你可以退出循环使用break,因为你找到了你正在寻找的类.
我想要的原因Class.forName是,如果VM尚未加载,它会为您加载类.这是一个非常强大的副作用.
它基本上解除了您在整个过程中挖掘CLASSPATH并查找要加载到VM中的类文件以及处理诸如VM是否已加载类等问题的麻烦.
编辑:
Jakob Jenkov撰写了一些关于Java的非常好的文章/教程.我发现它们在处理反射,类加载器和并发(Java的一些"最难"的方面)时非常有用.
这里的由他的Java类加载器的好文章,因为如果你仍然决定不使用Class.forName.
| 归档时间: |
|
| 查看次数: |
9096 次 |
| 最近记录: |