Java静态代理和动态代理总结

发布时间 - 2026-01-10 23:09:27    点击率:

静态代理

第一种实现(基于接口):

1》接口

public interface Hello {
 void say(String msg);
}

2》目标类,至少实现一个接口

public class HelloImpl implements Hello {
 public void say(String msg) {
  System.out.println("Hi,"+msg);
 }
}

3》代理类(与目标类实现相同接口,从而保证功能一致)

public class HelloProxy implements Hello{
 private Hello hello;
 public HelloProxy(Hello hello){
  this.hello = hello;
 }
 public void say(String msg){
  before();
  hello.say(msg);
  after();
 }
 private void before(){
  System.out.println("Before");
 }
 private void after(){
  System.out.println("After");
 }
}

3》测试

/**
 * @Author LZHL
 * @Create 2017-02-19 10:26
 * @Description
 */
public class Main {
 public static void main(String[] args) throws Exception {
  HelloImpl target = new HelloImpl();
  HelloProxy proxy = new HelloProxy(target);
  proxy.say("LZHL");
 }
}

第二种实现(基于目标类):

1>目标类

public class HelloTarget {
 public void sayHello(String name){
  System.out.println("Hi,"+name);
 }
}

2>代理类(通过继承目标类,保证功能一致)

public class HelloProxy extends HelloTarget{
  private HelloTarget target;
  public HelloProxy(HelloTarget target){
    this.target = target;
  } 
  @Override
 public void sayHello(String name) {
  this.before();
  target.sayHello(name);
  this.after();
 }
 private void before(){
  System.out.println("Before");
 }
 private void after(){
  System.out.println("After");
 }
}

3>测试

public class Main {
 public static void main(String[] args) throws Exception {
  HelloTarget target = new HelloTarget(); 
    HelloProxy proxy= new HelloProxy(target);
  proxy.sayHello("LZHL");
 }
}

动态代理

动态代理的代理类是在程序运行期间动态生成的,也有两种实现,一种是JDK动态代理,一种是CGLib动态代理

1》JDK动态代理(基于接口实现,与目标类实现相同接口,从而保证功能一致)

/**
 * @Author LZHL
 * @Create 2017-02-19 12:46
 * @Description
 */
public class Main {
 public static void main(String[] args){
  final HelloImpl target = new HelloImpl();
  Object proxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
   /*
    * proxy: 代理对象
    * method: 目标对象的方法对象
    * args: 目标对象方法的参数
    * return: 目标对象方法的返回值
    */
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("before");
    Object retValue = method.invoke(target, args);
    System.out.println("after");
    return retValue;
   }
  });
  Hello proxy = (Hello) proxyInstance;
  proxy.say("LYX");
  //可以把InvocationHandler提取出来,单独写一个类,为了方便大家看,这里我用内部类的形式
  class JDKProxy implements InvocationHandler {
   private Object target;
   public JDKProxy(Object target){
    this.target = target;
   }
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    before();
    Object result = method.invoke(target, args);
    after();
    return result;
   }
   private void before(){
    System.out.println("Before");
   }
   private void after(){
    System.out.println("After");
   }
  }
  InvocationHandler ih = new JDKProxy(target);
  Object proxyInstance2 = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), ih);
  Hello proxy2 = (Hello) proxyInstance2;
  proxy2.say("LZHL");
 }
}

2》CGLib动态代理(基于目标类,通过继承目标类,从而保证功能一致),需要导入cglib-3.2.4.jar包

pom.xml

<dependencies>
 <!-- https://mvnrepository.com/artifact/cglib/cglib -->
 <dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>3.2.4</version>
 </dependency>
</dependencies>

1)目标类

public class Hi {
 public void sayHi(String msg){
  System.out.println("Hi,"+msg);
 }
}

2)测试

/**
 * @Author LZHL
 * @Create 2017-02-19 13:19
 * @Description
 */
public class Main {
 public static void main(String[] args) {
  Enhancer enhancer = new Enhancer();
  //设置父类
  enhancer.setSuperclass(Hi.class);
  //设置回调函数
  enhancer.setCallback(new MethodInterceptor() {
   public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    System.out.println("before");
    Object retValue = methodProxy.invokeSuper(target, args);
    System.out.println("after");
    return retValue;
   }
  });
  Object proxy = enhancer.create();
  Hi hi = (Hi) proxy;
  hi.sayHi("LXY");
  //可以把MethodInterceptor提取出来,单独写一个类,为了方便大家看,这里我用内部类的形式
  class CGLibProxy implements MethodInterceptor {
   public <T> T getProxy(Class<T> clazz){
    return (T) Enhancer.create(clazz, this);
   }
   public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    before();
    Object result = proxy.invokeSuper(target, args);
    after();
    return result;
   }
   private void before(){
    System.out.println("Before");
   }
   private void after(){
    System.out.println("After");
   }
  }
  CGLibProxy cgLibProxy = new CGLibProxy();
  Hi hi2 = cgLibProxy.getProxy(Hi.class);
  hi2.sayHi("LZHL");
 }
}

以上所述是小编给大家介绍的Java静态代理和动态代理总结,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!


# java  # 静态代理  # java动态代理  # Java静态代理和动态代理的深入讲解  # Java动态代理静态代理实例分析  # Java代理模式实例详解【静态代理与动态代理】  # JAVA中的静态代理、动态代理以及CGLIB动态代理总结  # 浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)  # 深入解析java中的静态代理与动态代理  # java 静态代理 动态代理深入学习  # 浅谈Java 代理机制  # 我用  # 小编  # 是在  # 也有  # 两种  # 给大家  # 所述  # 回调  # 第二种  # 第一种  # 给我留言  # 返回值  # 有任何  # proxy  # target  # args  # Exception  # static  # main 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  如何在Windows虚拟主机上快速搭建网站?  微信推文制作网站有哪些,怎么做微信推文,急?  原生JS实现图片轮播切换效果  javascript基本数据类型及类型检测常用方法小结  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  如何在阿里云部署织梦网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  网站图片在线制作软件,怎么在图片上做链接?  javascript日期怎么处理_如何格式化输出  Linux系统命令中tree命令详解  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel怎么在Blade中安全地输出原始HTML内容  如何在宝塔面板中创建新站点?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  python中快速进行多个字符替换的方法小结  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  如何在阿里云香港服务器快速搭建网站?  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  5种Android数据存储方式汇总  Laravel定时任务怎么设置_Laravel Crontab调度器配置  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel怎么使用artisan命令缓存配置和视图  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  php打包exe后无法访问网络共享_共享权限设置方法【教程】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何做网站制作流程,*游戏网站怎么搭建?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何在IIS中新建站点并配置端口与物理路径?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Python并发异常传播_错误处理解析【教程】  在Oracle关闭情况下如何修改spfile的参数  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  微信小程序 require机制详解及实例代码  zabbix利用python脚本发送报警邮件的方法  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  如何用西部建站助手快速创建专业网站?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  如何破解联通资金短缺导致的基站建设难题?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势