【问题标题】:How to differentiate between interface and class from java Class如何从java类中区分接口和类
【发布时间】:2020-05-20 10:51:27
【问题描述】:

我有一些旧代码,如下所示:

    Set<Class<? extends Foo>> classes = reflections.getSubTypesOf(Foo.class);
    for (Class<? extends Foo> cl : classes) {
        Foo<?, ?> foo = cl.newInstance();
        // use foo
    }

我想添加另一个接口:

interface NewFoo extends Foo {...}

但随后它尝试在 NewFoo 上调用 newInstance。目前我的解决方案是这样的:

        try {
            Foo<?, ?> foo = cl.newInstance();
            // use foo
        } catch (InstantiationException ignore) {
        }

但我想知道是否有更好的方法?当我手上有一个 Class 对象时,我可以区分接口和类吗?

【问题讨论】:

  • 请注意,对于没有无参数构造函数的类,您的“解决方案”会失败。
  • 对于长期解决方案,我建议查看ServiceLoader 和基本概念。必须声明预期的实现作为自动发现可能看起来不太舒服,另一方面,它不承担自动使用已找到的任何匹配类的危险。而且它是获取不为反射开放的不同模块的实现实例的唯一干净解决方案。

标签: java class reflection interface


【解决方案1】:

可以在Class中调用实例方法

 clazz.isInterface() 

【讨论】:

    【解决方案2】:

    可以通过调用isInterface()方法来区分Class对象是否代表接口类型。

    见下文:

    Set<Class<? extends Foo>> classes = reflections.getSubTypesOf(Foo.class);
    for (Class<? extends Foo> cl : classes) {
    
        if (! cl.isInterface()) {
            Foo<?, ?> foo = cl.newInstance();
            // use foo
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多