第31.2篇:Java反射与代理代码示例集(2026版)
📌系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第31篇:Java数组详解 |
➡️ 下一篇:第32篇:Java常用工具类
🗺️ 本文阅读地图(2 分钟速览)
反射和代理是面试中的“高阶考点”,也是框架源码的基础。本文汇总 8 个可直接运行的代码模板,覆盖反射操作、动态代理、注解等所有高频场景:
| 编号 | 模板 | 适用场景 |
|---|---|---|
| 1 | 获取 Class 对象的 3 种方式 | 反射入口 |
| 2 | 反射创建对象 | 动态实例化 |
| 3 | 反射调用方法 | 动态方法调用 |
| 4 | 反射访问私有字段 | 私有属性操作 |
| 5 | JDK 动态代理 | 接口代理 |
| 6 | CGLIB 动态代理 | 无接口类代理 |
| 7 | 自定义注解 | 注解定义与使用 |
| 8 | 注解解析(反射读取) | 框架基础 |
文章目录
- 第31.2篇:Java反射与代理代码示例集(2026版)
- 🗺️ 本文阅读地图(2 分钟速览)
- 一、核心知识点概览
- 二、逐模板详解
- 模板1:获取 Class 对象的 3 种方式
- 模板2:反射创建对象
- 模板3:反射调用方法
- 模板4:反射访问私有字段
- 模板5:JDK 动态代理
- 模板6:CGLIB 动态代理(无接口类)
- 模板7:自定义注解
- 模板8:注解解析(反射读取)
- 三、避坑要点
- 四、练习题
- 📊 你的学习进度
- 👉 下一篇文章预告
一、核心知识点概览
本篇文章涵盖反射与代理中 8 个最高频的面试手写代码模板,来源于第26~28篇的全部内容:
| 篇号 | 模板数量 | 涉及主题 |
|---|---|---|
| 第26篇 | 2个 | 自定义注解、注解解析 |
| 第27篇 | 2个 | JDK 动态代理、CGLIB 代理 |
| 第28篇 | 4个 | Class 获取、反射创建、反射调用、反射私有访问 |
二、逐模板详解
模板1:获取 Class 对象的 3 种方式
publicclassClassDemo{publicstaticvoidmain(String[]args)throwsClassNotFoundException{// 方式1:Class.forName()(最常用,会触发类初始化)Class<?>clazz1=Class.forName("java.lang.String");// 方式2:类名.class(不触发初始化)Class<?>clazz2=String.class;// 方式3:对象.getClass()Stringstr="hello";Class<?>clazz3=str.getClass();System.out.println(clazz1==clazz2);// trueSystem.out.println(clazz1==clazz3);// true}}模板2:反射创建对象
importjava.lang.reflect.Constructor;publicclassCreateInstanceDemo{publicstaticvoidmain(String[]args)throwsException{Class<?>clazz=Person.class;// 方式1:无参构造Personp1=(Person)clazz.getDeclaredConstructor().newInstance();// 方式2:有参构造Constructor<?>ctor=clazz.getConstructor(String.class,int.class);Personp2=(Person)ctor.newInstance("张三",25);System.out.println(p2);}}classPerson{privateStringname;privateintage;publicPerson(){}publicPerson(Stringname,intage){this.name=name;this.age=age;}@OverridepublicStringtoString(){return"Person{name='"+name+"', age="+age+"}";}}模板3:反射调用方法
importjava.lang.reflect.Method;publicclassInvokeMethodDemo{publicstaticvoidmain(String[]args)throwsException{Calculatorcalc=newCalculator();// 调用 public 方法MethodaddMethod=Calculator.class.getMethod("add",int.class,int.class);intresult=(int)addMethod.invoke(calc,10,20);System.out.println(result);// 30// 调用私有方法MethodprivateMethod=Calculator.class.getDeclaredMethod("multiply",int.class,int.class);privateMethod.setAccessible(true);intresult2=(int)privateMethod.invoke(calc,5,6);System.out.println(result2);// 30}}classCalculator{publicintadd(inta,intb){returna+b;}privateintmultiply(inta,intb){returna*b;}}模板4:反射访问私有字段
importjava.lang.reflect.Field;publicclassFieldDemo{publicstaticvoidmain(String[]args)throwsException{Useruser=newUser("张三",25);FieldnameField=User.class.getDeclaredField("name");nameField.setAccessible(true);// 读取私有字段Stringname=(String)nameField.get(user);System.out.println(name);// 张三// 修改私有字段nameField.set(user,"李四");System.out.println(user.getName());// 李四}}classUser{privateStringname;privateintage;publicUser(Stringname,intage){this.name=name;this.age=age;}publicStringgetName(){returnname;}}模板5:JDK 动态代理
importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;// 接口interfaceUserService{voidaddUser(Stringname);voiddeleteUser(Stringname);}// 目标类classUserServiceImplimplementsUserService{@OverridepublicvoidaddUser(Stringname){System.out.println("添加用户:"+name);}@OverridepublicvoiddeleteUser(Stringname){System.out.println("删除用户:"+name);}}// InvocationHandlerclassLogHandlerimplementsInvocationHandler{privateObjecttarget;publicLogHandler(Objecttarget){this.target=target;}@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("调用前:"+method.getName());Objectresult=method.invoke(target,args);System.out.println("调用后:"+method.getName());returnresult;}}// 使用publicclassJDKProxyDemo{publicstaticvoidmain(String[]args){UserServicetarget=newUserServiceImpl();UserServiceproxy=(UserService)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),newLogHandler(target));proxy.addUser("张三");}}模板6:CGLIB 动态代理(无接口类)
importnet.sf.cglib.proxy.Enhancer;importnet.sf.cglib.proxy.MethodInterceptor;importnet.sf.cglib.proxy.MethodProxy;importjava.lang.reflect.Method;// 目标类(无需实现接口)classRealService{publicvoiddoSomething(){System.out.println("执行核心业务");}}// 方法拦截器classCglibInterceptorimplementsMethodInterceptor{@OverridepublicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{System.out.println("CGLIB 前置增强");Objectresult=proxy.invokeSuper(obj,args);System.out.println("CGLIB 后置增强");returnresult;}}// 使用publicclassCglibProxyDemo{publicstaticvoidmain(String[]args){Enhancerenhancer=newEnhancer();enhancer.setSuperclass(RealService.class);enhancer.setCallback(newCglibInterceptor());RealServiceproxy=(RealService)enhancer.create();proxy.doSomething();}}模板7:自定义注解
importjava.lang.annotation.*;// 自定义注解@Retention(RetentionPolicy.RUNTIME)// 保留到运行时@Target(ElementType.METHOD)// 只能用在方法上@interfaceMyTest{Stringvalue()default"";intpriority()default1;}模板8:注解解析(反射读取)
importjava.lang.reflect.Method;publicclassAnnotationParseDemo{publicstaticvoidmain(String[]args)throwsException{// 获取类上的注解Class<?>clazz=TestClass.class;MyTestclassAnno=clazz.getAnnotation(MyTest.class);// 获取方法上的注解Methodmethod=clazz.getMethod("testMethod");MyTestmethodAnno=method.getAnnotation(MyTest.class);System.out.println("方法注解 value: "+methodAnno.value());System.out.println("方法注解 priority: "+methodAnno.priority());}}@MyTest(value="类注解",priority=5)classTestClass{@MyTest(value="方法注解",priority=10)publicvoidtestMethod(){}}三、避坑要点
| 错误/误区 | 后果 | 正确做法 |
|---|---|---|
忘记setAccessible(true) | IllegalAccessException | 访问私有前必须设置 |
| 反射频繁调用 | 性能下降 | 缓存 Method/Field |
| JDK 代理目标没有接口 | ClassCastException | 用 CGLIB |
| CGLIB 代理 final 类/方法 | 代理失败 | 避免代理 final |
四、练习题
手写题:用 JDK 动态代理实现一个性能监控代理,打印方法执行耗时。
手写题:定义一个
@NotNull注解,用于标记方法的参数不能为 null,然后用反射实现校验。分析题:JDK 动态代理和 CGLIB 的区别是什么?各自适用什么场景?
📊 你的学习进度
- 当前:第31.2篇 ·基础篇外挂:反射与代理代码示例集
- ✅ 已完成:基础篇第1~31篇 + 第4.1篇 + 第20.1~20.4篇 + 第31.2篇
- 📖 正在学:第31.2篇
- ⏳ 待学习:第32~44篇(主体)+ 更多外挂篇
👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇
👉 下一篇文章预告
🚀下一篇:《第32篇:Java常用工具类》
内容简介:Objects、Collections、Arrays 工具类使用与对比。
📌《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!