如何使用java.lang.Class测试声明为"public class"的类型是类?



java.lang.Class有方法来测试给定的类型是否为:

  • isAnnotation
  • isArray
  • isEnum
  • isInterface
  • isPrimitive

,但是如何测试类型为Class (instanceof Classtrue)的对象表示声明的非抽象类,而不是接口、枚举、原语、数组等。例如:

package org.acme;
public class ACME {
      public ACME() {
      }
      public static void main(String[] args) {
        Class clazz = Class.forName("org.acme.ACME");
       // Expected I could use a clazz.isClass().
      }
}

我正在寻找一个isClass方法,但是没有。


我看到了我的问题引起的困惑——而有些人明白我的问题。

我做了一些进一步的研究,发现在。net

http://msdn.microsoft.com/en-us/library/system.type.isclass.aspx

这是一个isClass成员,我在java.lang.Class中寻找类似的方法。

我现在知道,在Java中等效的是测试所有其他isXXX方法,以找出它不是一个类

你的问题似乎有点脱节。所有都是一个类(除了原语——isPrimitive()方法实际上意味着类是一个自动框类型)。

Class clazz = Class.forName("org.acme.ACME");
// Expected I could use a clazz.isClass().

那是多余的。你已经知道这是一个类。因为你有一个Class的实例。

似乎出于某种原因,你想知道它不是任何类型类的方法列表告诉你,在这种情况下,你只需做一个检查来否定这些选项:

if (!clazz.isAnnotation() &&
    !clazz.isArray() /* && ... etc */ ) 
{
    // Not any of those things.
}

Class对象是单例对象。因此,如果您有任何类型的实例,您可以使用

测试它是否是一个确切的类实例:
theInstance.getClass() == TheTargetClass.class

至于测试一个类是否为"完整"类,只需否定您提到的所有测试。第一个测试已经是一个有效的过滤器…别忘了.isSynthetic()

不太好读但是

object.getClass().getModifiers() < 30 //abstract classes are not included

或者以更易读的方式:

object.getClass().getModifiers() < Modifier.PROTECTED + Modifier.STATIC + Modifier.FINAL

似乎可以工作,比

更整洁(但更模糊)
!(!isInterface() && !isEnum() && !is ...) 

简单类只能有以下修饰符:

public static final int PUBLIC           = 0x00000001;
public static final int PRIVATE          = 0x00000002;
public static final int PROTECTED        = 0x00000004;
public static final int STATIC           = 0x00000008;
public static final int FINAL            = 0x00000010;

,而abstract、interface、enum或annotation的值较大(超过200)。

可以通过调用Modifier.toString(myClass.getModifiers())来查看类的修饰符。getModifiers()类返回所有修饰符的十六进制和(正如我在一些值上测试的那样;

部分解决方案:您可以尝试执行类的newInstance方法。如果类是抽象类或接口类,则会抛出InstantiationException——否则,就可以了。

问题是,在一个你不知道的类中创建一个新实例可能会有未知的效果,或者这个类可能没有默认构造函数。

你应该有两个选择:

  1. 你可以做class instanceof Object
  2. 您可以检查所有其他is...()方法。如果它们都是假的,你就有一个类。

相关内容

最新更新