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方法,以找出它不是一个类
你的问题似乎有点脱节。所有都是一个类(除了原语——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
——否则,就可以了。
问题是,在一个你不知道的类中创建一个新实例可能会有未知的效果,或者这个类可能没有默认构造函数。
你应该有两个选择:
- 你可以做
class instanceof Object
- 您可以检查所有其他
is...()
方法。如果它们都是假的,你就有一个类。