java.lang.Class有测试给定类型是否为的方法:
但是如何测试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方法,以发现它不是一个类。
答案 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)
两个适合您的选项:
class instanceof Object
is...()
方法。如果他们都是假的你有一个班级。