Java中获取Class实例有三种主要方式:1. 对象.getClass(),适用于已有实例,返回运行时类型且不触发类初始化,但基本类型不可用;2. 类名.class,编译期确定,安全简洁,支持基本类型和void;3. Class.forName(),按字符串动态加载类,默认触发初始化,需处理异常并注意内部类命名。

Java中每个类型(包括基本类型和void)都对应一个唯一的Class对象,但获取方式与引用类型不同——它们不通过.class字面量以外的方式运行时生成,也不能用Class.forName()加载。
基本类型的Class对象:用.type属性
8个基本类型(boolean、char、byte、short、int、long、float、double)的Class对象,通过其包装类的TYPE静态字段获取:
-
Boolean.TYPE→boolean.class -
Character.TYPE→char.class -
Byte.TYPE→byte.class -
Short.TYPE→short.class -
Integer.TYPE→int.class -
Long.TYPE→long.class -
Float.TYPE→float.class -
Double.TYPE→double.class
这些等价于直接写int.class等形式,但TYPE在泛型擦除或反射工具类中更易统一处理。
void类型的Class对象:只有Void.TYPE
void不是类,也没有包装类,但它有且仅有一个对应的Class对象:Void.TYPE。
它等价于void.class(JDK 1.5+支持),但Void.TYPE是唯一能在早期版本安全使用的写法。注意:Void.class是java.lang.Void这个类的Class对象,不是void关键字的类型;而Void.TYPE才是真正的void类型标识。
数组、泛型与基本类型Class的区别
基本类型数组(如int[])的Class对象可直接用int[].class,其getName()返回[I(JVM内部表示);而引用类型数组(如String[].class)返回[Ljava.lang.String;。
泛型信息在运行时被擦除,所以List<string>.class</string>和List<integer>.class</integer>指向同一个Class对象——即ArrayList.class(若为具体实现),无法通过Class区分泛型参数。
验证Class是否代表基本类型或void
可通过以下方法判断:
-
clazz.isPrimitive():返回true当且仅当是8种基本类型之一(不含void) -
clazz == void.class || clazz == Void.TYPE:显式检查void -
clazz.isArray():判断是否为任意维度数组 -
clazz.isInterface()、clazz.getSuperclass() != null:辅助判断是否为引用类型
注意:void.class.isPrimitive()返回false,因为void在JVM规范中被明确排除在primitive type之外。

















