全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

静态代理

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

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 


相关文章: 广平建站公司哪家专业可靠?如何选择?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  如何在万网ECS上快速搭建专属网站?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  建站之星安装提示数据库无法连接如何解决?  如何通过多用户协作模板快速搭建高效企业网站?  如何通过虚拟主机快速完成网站搭建?  建站主机如何安装配置?新手必看操作指南  如何快速建站并高效导出源代码?  网站制作价目表怎么做,珍爱网婚介费用多少?  如何快速辨别茅台真假?关键步骤解析  实惠建站价格推荐:2025年高性价比自助建站套餐解析  建站之星后台管理如何实现高效配置?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  制作网站的基本流程,设计网站的软件是什么?  TestNG的testng.xml配置文件怎么写  如何用花生壳三步快速搭建专属网站?  济南企业网站制作公司,济南社保单位网上缴费步骤?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  如何通过.red域名打造高辨识度品牌网站?  制作旅游网站html,怎样注册旅游网站?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  建站上市公司网站建设方案与SEO优化服务定制指南  如何在Golang中引入测试模块_Golang测试包导入与使用实践  如何获取开源自助建站系统免费下载链接?  南宁网站建设制作定制,南宁网站建设可以定制吗?  如何设计高效校园网站?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  网站app免费制作软件,能免费看各大网站视频的手机app?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  英语简历制作免费网站推荐,如何将简历翻译成英文?  网站制作话术技巧,网站推广做的好怎么话术?  官网网站制作腾讯审核要多久,联想路由器newifi官网  高防服务器:AI智能防御DDoS攻击与数据安全保障  怎么将XML数据可视化 D3.js加载XML  定制建站流程步骤详解:一站式方案设计与开发指南  建设网站制作价格,怎样建立自己的公司网站?  如何快速使用云服务器搭建个人网站?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  如何选择最佳自助建站系统?快速指南解析优劣  如何配置FTP站点权限与安全设置?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  建站之星×万网:智能建站系统+自助建站平台一键生成  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  中山网站推广排名,中山信息港登录入口?  C++时间戳转换成日期时间的步骤和示例代码 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。