如何测试声明为“的类型”;“公开课”;类是否使用java.lang.class?

如何测试声明为“的类型”;“公开课”;类是否使用java.lang.class?,java,Java,java.lang.Class具有测试给定类型是否为以下类型的方法: 注释 伊萨雷 伊塞努姆 界面 基本的 但是如何测试Class类型的对象(instanceof Classistrue)是否表示已声明的非抽象类,而不是接口、枚举、基元、数组等中的类。例如: package org.acme; public class ACME { public ACME() { } public static void main(String[] args) {

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

  • 注释
  • 伊萨雷
  • 伊塞努姆
  • 界面
  • 基本的
但是如何测试Class类型的对象(
instanceof Class
is
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中发现了这一点

,

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


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

class
对象是单例的。因此,如果您有任何类型的实例,可以使用以下方法测试该实例是否为确切的类实例:

theInstance.getClass() == TheTargetClass.class

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

这两个选项应该适合您:

  • 您可以执行对象的类实例
  • 您可以检查所有其他
    is…()
    方法。如果它们都是假的,你就有了一门课
    你的问题似乎有点脱节。所有东西都是一个类(除了原语,
    isPrimitive()
    方法实际上意味着该类是一个autobox类型)

    这是多余的。你已经知道这是一门课了。因为您有一个
    类的实例

    似乎出于某种原因,您希望知道它不是您列出的方法告诉您的任何类型的类,在这种情况下,您只需进行一次检查以否定这些选项:

    if (!clazz.isAnnotation() &&
        !clazz.isArray() /* && ... etc */ ) 
    {
    
        // Not any of those things.
    
    }
    
    部分解决方案: 您可以尝试执行类的
    newInstance
    方法。如果类是抽象的或接口,则会抛出
    InstantiationException
    ,否则就可以了

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

    可读性不强,但

    object.getClass().getModifiers() < 30 //abstract classes are not included
    
    简单类只能具有以下修饰符:

    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;
    
    而抽象、交互、枚举或注释的值较大(超过200)



    通过调用
    Modifier.toString(myClass.getModifiers())
    ,可以查看类的修饰符。
    getModifiers()
    类返回所有修饰符的六进制总和(正如我在一些值上测试过的;实现是本机的)。

    为什么不测试
    instanceof
    ?@0A0D在这种情况下有何帮助?你的意思是说
    isClass
    ,因为你的类型不是枚举、接口等。?或者
    isClass
    在某种意义上说,一个对象是这种特殊类型的?@0A0D在我看来,他似乎想要获取一个
    ,并确定它是否是一个普通的旧类(不是接口、枚举等)。@arshajii。绝对地我认为这没有抓住重点;他想获取一个
    对象,并确定它是否代表一个“常规”类,即不是接口、枚举等。如果您不知道
    目标类
    (您需要动态)会发生什么情况@fge。谢谢,但在实际情况中,我不知道类型,即targetClass.class.@J.Gonzalez,那么您想确切了解什么特征?一定有一些filter@fge. 谢谢你的帮助。问题已经更新,我添加了一些评论以澄清问题。从现在的答案来看,我们必须测试java.lang.Class不是一个接口、枚举、数组等。为了更好的解释,我们要找出它是一个java类(POJO)。实际上,
    Class
    没有像
    isPlainOldClass
    这样的方法,我有点惊讶@arshajii我质疑这种东西的实用性(实际上是我上面列出的)。你为什么会在乎呢?但是……这不是问题:)我想你是对的。考虑到已经有方法来测试类是否表示数组、接口、枚举等等,这似乎是合乎逻辑的。“但是,是的,这种效用可能仍然有限。”布赖恩·罗奇说。为了澄清这个问题,您将如何命名一个不是其他isXXX类型(注释、枚举、接口等)的类型?见评论。一节课?波乔?让我知道。关于这样一件事的效用,让我来判断一下。我不是突然问这个问题的。神奇的数字是神奇的。无意冒犯,但如果我看到了,我会想掐死某人。我喜欢这个概念,而且将代码提取为一种方法应该不会有问题,这样“魔法数字”就可以被本地化到一个单独的文档化位置。但是,这还不够,因为Modifiers.XXX不处理数组和基元。@KevinWelker如果忽略抽象类,您可以使用它,因为数组和基元类是抽象的(和最终的)。hmmm。。。我不知道关于数组。不过我只是尝试了原语,它们不是抽象的。@KevinWelker正在运行
    System.out.println(Modifier.toString(int.class.getModifiers())在Java 6 u 37中打印
    公共摘要最终版
    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;