《Java 100 天进阶之路》第31.2篇:Java反射与代理代码示例集(2026版)
2026/7/16 19:54:51 网站建设 项目流程

第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:反射访问私有字段
        • 模板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

四、练习题

  1. 手写题:用 JDK 动态代理实现一个性能监控代理,打印方法执行耗时。

  2. 手写题:定义一个@NotNull注解,用于标记方法的参数不能为 null,然后用反射实现校验。

  3. 分析题: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!
👉 点击关注我,更新后第一时间收到推送!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询