如何测试声明为“的类型”;“公开课”;类是否使用java.lang.class?
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) {
- 注释
- 伊萨雷
- 伊塞努姆
- 界面
- 基本的
instanceof Class
istrue
)是否表示已声明的非抽象类,而不是接口、枚举、基元、数组等中的类。例如:
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;