Java如何获取指定类中所有实例变量的类型列表?
Java反射获取类实例变量类型的实现方案
首先纠正认知误区:字段的声明类型属于类的固有结构信息,编译后就存储在类的字节码中,和是否实例化对象、是否给字段赋值完全无关,反射完全支持直接读取该信息。
核心实现逻辑
- 通过类字面量
Attributes.class获取目标类的Class对象,无需实例化类 - 调用
getDeclaredFields()方法获取当前类声明的所有字段(支持protected/private/默认修饰符的字段,若仅需public字段可替换为getFields()) - 遍历字段数组,调用每个
Field对象的getType()方法获取字段的声明类型,再通过getSimpleName()拿到类型的短名称 - 存入
Set自动去重,最终输出你需要的类型集合
可运行代码示例
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class GetFieldTypes { public static void main(String[] args) { Set<String> fieldTypeSet = new HashSet<>(); // 直接获取Attributes类的字节码对象,无需创建实例 Class<Attributes> attributesClazz = Attributes.class; // 获取所有本类声明的字段 Field[] allFields = attributesClazz.getDeclaredFields(); for (Field field : allFields) { // 取字段类型的短名称,如需全限定名可替换为getName() String typeName = field.getType().getSimpleName(); fieldTypeSet.add(typeName); } // 转换为列表输出,结果就是你要的[A,B,C] List<String> result = new ArrayList<>(fieldTypeSet); System.out.println(result); } }
注意事项
- 如果需要获取从父类继承的字段,需要递归遍历父类的
getDeclaredFields(),getDeclaredFields()默认仅返回当前类直接声明的字段 - 如果你需要的是字段运行时的实际类型,才需要实例化对象后调用
field.get(实例对象).getClass()获取,你的需求是类定义的声明类型,直接用getType()即可 - 只要Attributes类能被正常加载到JVM中,该代码就能正常运行,不需要给任何字段赋值
内容的提问来源于stack exchange,提问作者Shivanshu
相关产品推荐
相关产品推荐

