如何测试声明为“公共类”的类型是使用java.lang.Class的类?

时间:2013-06-19 17:33:18

标签: java

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

  • isAnnotation
  • IsArray的
  • isEnum
  • isInterface
  • isPrimitive

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

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方法,以发现它不是一个类。

5 个答案:

答案 0 :(得分:6)

你的问题似乎有些脱节。 Everything 是一个类(除了原语 - 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.

}

答案 1 :(得分:4)

Class个对象是单身人士。因此,如果您有任何类型的实例,则可以使用以下命令测试它是一个确切的类实例:

theInstance.getClass() == TheTargetClass.class

至于测试一个类是否是一个“完整”类,只是否定你提到的所有测试。第一次测试已经是一个有效的过滤器......不要忘记.isSynthetic()

答案 2 :(得分:3)

不太可读,但

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,interafce,enum或annotation具有更大的值(超过200)。

您可以通过调用Modifier.toString(myClass.getModifiers())来查看类的修饰符。 getModifiers()类返回所有修饰符的六进制和(因为我已经测试了一些值;实现是本机的)。

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

两个适合您的选项:

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