使用反射检查类
在运行时获取 Class 对象,并检查字段、方法、构造方法和注解
使用反射检查类 是 CoddyKit 上的免费 Java Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
什么是反射
反射允许 Java 程序在运行时检查和操作自身的结构——读取类名、字段、方法、构造器和注解,而无需在编译时知晓这些信息。
获取 Class 对象
可以通过类字面量、getClass() 或 Class.forName() 获取 Class<?> 对象。
Class<String> c1 = String.class; // literal
Class<?> c2 = "hello".getClass(); // from instance
Class<?> c3 = Class.forName("java.util.ArrayList"); // by name检查类的元数据
可以从 Class 对象中获取类名、包名、父类和所实现的接口。
Class<?> c = ArrayList.class;
System.out.println(c.getName()); // java.util.ArrayList
System.out.println(c.getSimpleName()); // ArrayList
System.out.println(c.getSuperclass()); // class java.util.AbstractList
for (Class<?> iface : c.getInterfaces()) System.out.println(iface.getName());列出已声明的字段
getDeclaredFields() 返回类中声明的所有字段(包括私有字段)。getFields() 只返回公共字段,但也包括继承的字段。
for (Field f : User.class.getDeclaredFields()) {
System.out.printf("%-10s %s%n", f.getType().getSimpleName(), f.getName());
}列出方法
getDeclaredMethods() 列出所有方法(不受访问级别限制)。如果需要包括继承方法的公共方法,请使用 getMethods()。
for (Method m : String.class.getDeclaredMethods()) {
System.out.println(m.getName() + " -> " + m.getReturnType().getSimpleName());
}检查方法参数
获取参数类型、参数名(需要使用 -parameters 编译器标志)和注解。
Method m = UserService.class.getDeclaredMethod("findById", Long.class);
for (Parameter p : m.getParameters()) {
System.out.println(p.getType().getSimpleName() + " " + p.getName());
}列出构造器
检查构造器的方法与检查方法类似。getDeclaredConstructors() 会包括私有构造器,单例或构建器中会使用这些构造器。
for (Constructor<?> c : User.class.getDeclaredConstructors()) {
System.out.println(Arrays.toString(c.getParameterTypes()));
}读取注解
获取类、方法或字段上的注解。请使用 isAnnotationPresent 检查注解是否存在,并使用 getAnnotation 获取其值。
@RestController
@RequestMapping("/users")
public class UserController {}
// Inspection:
RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println("Path: " + Arrays.toString(rm.value()));检查修饰符
请在字段、方法或类的修饰符上使用 Modifier.isPublic()、isStatic()、isFinal() 等方法,按可见性进行筛选。
for (Field f : User.class.getDeclaredFields()) {
int mod = f.getModifiers();
if (Modifier.isPrivate(mod)) System.out.println("private: " + f.getName());
}isAssignableFrom 与 instanceof 检查
请使用 Class.isAssignableFrom() 以编程方式检查类型兼容性——它等同于 instanceof,但适用于只能在运行时获知的类对象。
Class<?> parent = Collection.class;
Class<?> child = ArrayList.class;
System.out.println(parent.isAssignableFrom(child)); // true
System.out.println(child.isAssignableFrom(parent)); // false性能注意事项
对于简单的字段或方法访问,反射的速度比直接代码慢 10–50 倍。请缓存 Field 和 Method 对象;调用一次 setAccessible(true) 后重复使用。
private static final Field NAME_FIELD;
static {
try { NAME_FIELD = User.class.getDeclaredField("name"); NAME_FIELD.setAccessible(true); }
catch (NoSuchFieldException e) { throw new RuntimeException(e); }
}快速检查
哪个方法会返回类的私有字段(但不包括继承的字段)?
回顾
通过类字面量或 forName() 获取 Class。使用 getDeclaredFields/Methods/Constructors 检查所有访问级别的成员。使用 getAnnotation 读取注解。缓存反射对象以提升性能。
常见问题解答
「使用反射检查类」课时是免费的吗?
是的 — 「使用反射检查类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「使用反射检查类」这节课中我会学到什么?
在运行时获取 Class 对象,并检查字段、方法、构造方法和注解 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「使用反射检查类」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。