加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 检查类是否存在而不运行到ClassNotFoundException

发布时间:2020-12-14 23:47:40 所属栏目:Java 来源:网络整理
导读:为了安排作业的执行,我得到一个类的名称作为字符串输入. 这个类可能是两个包中的一个,但我不知道哪一个,所以我必须检查这个. 到现在为止,我有两个try-catch-blocks ClassJob clazz;String className; //the above mentioned string,will be initializedtry {
为了安排作业的执行,我得到一个类的名称作为字符串输入.
这个类可能是两个包中的一个,但我不知道哪一个,所以我必须检查这个.

到现在为止,我有两个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
    }
}

对于更多的包,这将变得更加丑陋,更难以理解.此外,对我而言,它违背了例外的概念,因为异常不应该被预期/用于流量控制!
有没有办法在不使用ClassNotFoundException的情况下重写它?

解决方法

我坚持使用Class.forName方法.

您可以将类和包名称存储在集合或集合中,并循环遍历这些元素.当您收到ClassNotFoundException时,您只需继续搜索.如果没有异常,则使用break退出循环,因为您找到了要查找的类.

我之所以选择Class.forName,是因为如果它还没有被VM加载,它会为你加载类.这是一个非常强大的副作用.

它基本上解除了您在整个CLASSPATH中挖掘并查找要在VM中加载的类文件以及处理诸如VM是否已加载类等问题的麻烦.

编辑:

Jakob Jenkov撰写了一些关于Java的非常好的文章/教程.我发现它们在处理反射,类加载器和并发(Java的一些“最难”的方面)时非常有用.

Here是他在Java类加载器上的一篇很好的文章,因为如果你仍然决定不使用Class.forName.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读