《Java 100 天进阶之路》第31.2篇:Java反射与代理代码示例集(2026版)

发布时间:2026/7/16 19:54:56

《Java 100 天进阶之路》第31.2篇:Java反射与代理代码示例集(2026版) 第31.2篇Java反射与代理代码示例集2026版系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第31篇Java数组详解 |➡️ 下一篇第32篇Java常用工具类️ 本文阅读地图2 分钟速览反射和代理是面试中的“高阶考点”也是框架源码的基础。本文汇总 8 个可直接运行的代码模板覆盖反射操作、动态代理、注解等所有高频场景编号模板适用场景1获取 Class 对象的 3 种方式反射入口2反射创建对象动态实例化3反射调用方法动态方法调用4反射访问私有字段私有属性操作5JDK 动态代理接口代理6CGLIB 动态代理无接口类代理7自定义注解注解定义与使用8注解解析反射读取框架基础文章目录第31.2篇Java反射与代理代码示例集2026版️ 本文阅读地图2 分钟速览一、核心知识点概览二、逐模板详解模板1获取 Class 对象的 3 种方式模板2反射创建对象模板3反射调用方法模板4反射访问私有字段模板5JDK 动态代理模板6CGLIB 动态代理无接口类模板7自定义注解模板8注解解析反射读取三、避坑要点四、练习题 你的学习进度 下一篇文章预告一、核心知识点概览本篇文章涵盖反射与代理中 8 个最高频的面试手写代码模板来源于第26~28篇的全部内容篇号模板数量涉及主题第26篇2个自定义注解、注解解析第27篇2个JDK 动态代理、CGLIB 代理第28篇4个Class 获取、反射创建、反射调用、反射私有访问二、逐模板详解模板1获取 Class 对象的 3 种方式publicclassClassDemo{publicstaticvoidmain(String[]args)throwsClassNotFoundException{// 方式1Class.forName()最常用会触发类初始化Class?clazz1Class.forName(java.lang.String);// 方式2类名.class不触发初始化Class?clazz2String.class;// 方式3对象.getClass()Stringstrhello;Class?clazz3str.getClass();System.out.println(clazz1clazz2);// trueSystem.out.println(clazz1clazz3);// true}}模板2反射创建对象importjava.lang.reflect.Constructor;publicclassCreateInstanceDemo{publicstaticvoidmain(String[]args)throwsException{Class?clazzPerson.class;// 方式1无参构造Personp1(Person)clazz.getDeclaredConstructor().newInstance();// 方式2有参构造Constructor?ctorclazz.getConstructor(String.class,int.class);Personp2(Person)ctor.newInstance(张三,25);System.out.println(p2);}}classPerson{privateStringname;privateintage;publicPerson(){}publicPerson(Stringname,intage){this.namename;this.ageage;}OverridepublicStringtoString(){returnPerson{namename, ageage};}}模板3反射调用方法importjava.lang.reflect.Method;publicclassInvokeMethodDemo{publicstaticvoidmain(String[]args)throwsException{CalculatorcalcnewCalculator();// 调用 public 方法MethodaddMethodCalculator.class.getMethod(add,int.class,int.class);intresult(int)addMethod.invoke(calc,10,20);System.out.println(result);// 30// 调用私有方法MethodprivateMethodCalculator.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){returnab;}privateintmultiply(inta,intb){returna*b;}}模板4反射访问私有字段importjava.lang.reflect.Field;publicclassFieldDemo{publicstaticvoidmain(String[]args)throwsException{UserusernewUser(张三,25);FieldnameFieldUser.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.namename;this.ageage;}publicStringgetName(){returnname;}}模板5JDK 动态代理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.targettarget;}OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println(调用前method.getName());Objectresultmethod.invoke(target,args);System.out.println(调用后method.getName());returnresult;}}// 使用publicclassJDKProxyDemo{publicstaticvoidmain(String[]args){UserServicetargetnewUserServiceImpl();UserServiceproxy(UserService)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),newLogHandler(target));proxy.addUser(张三);}}模板6CGLIB 动态代理无接口类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 前置增强);Objectresultproxy.invokeSuper(obj,args);System.out.println(CGLIB 后置增强);returnresult;}}// 使用publicclassCglibProxyDemo{publicstaticvoidmain(String[]args){EnhancerenhancernewEnhancer();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?clazzTestClass.class;MyTestclassAnnoclazz.getAnnotation(MyTest.class);// 获取方法上的注解Methodmethodclazz.getMethod(testMethod);MyTestmethodAnnomethod.getAnnotation(MyTest.class);System.out.println(方法注解 value: methodAnno.value());System.out.println(方法注解 priority: methodAnno.priority());}}MyTest(value类注解,priority5)classTestClass{MyTest(value方法注解,priority10)publicvoidtestMethod(){}}三、避坑要点错误/误区后果正确做法忘记setAccessible(true)IllegalAccessException访问私有前必须设置反射频繁调用性能下降缓存 Method/FieldJDK 代理目标没有接口ClassCastException用 CGLIBCGLIB 代理 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 点击关注我更新后第一时间收到推送

相关新闻