全网整合营销服务商

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

免费咨询热线: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 


相关文章: 网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  如何快速生成高效建站系统源代码?  教程网站设计制作软件,怎么创建自己的一个网站?  如何高效完成自助建站业务培训?  如何快速搭建高效WAP手机网站?  nginx修改上传文件大小限制的方法  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  在线制作视频的网站有哪些,电脑如何制作视频短片?  定制建站是什么?如何实现个性化需求?  北京专业网站制作设计师招聘,北京白云观官方网站?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  家庭服务器如何搭建个人网站?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  C#如何使用XPathNavigator高效查询XML  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  上海网站制作开发公司,上海买房比较好的网站有哪些?  电商平台网站制作流程,电商网站如何制作?  如何用PHP快速搭建CMS系统?  常州企业建站如何选择最佳模板?  建站主机是什么?如何选择适合的建站主机?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  如何在阿里云香港服务器快速搭建网站?  网页设计与网站制作内容,怎样注册网站?  如何用PHP快速搭建高效网站?分步指南  如何用低价快速搭建高质量网站?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  制作营销网站公司,淘特是干什么用的?  建站之星如何通过成品分离优化网站效率?  如何在宝塔面板创建新站点?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何快速搭建高效香港服务器网站?  制作宣传网站的软件,小红书可以宣传网站吗?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  定制建站价位费用解析与套餐推荐全攻略  XML的“混合内容”是什么 怎么用DTD或XSD定义  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  ,有什么在线背英语单词效率比较高的网站?  建站主机服务器选购指南:轻量应用与VPS配置解析  建站之星如何助力网站排名飙升?揭秘高效技巧  深圳网站制作的公司有哪些,dido官方网站?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  建站中国官网:模板定制+SEO优化+建站流程一站式指南  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何在景安服务器上快速搭建个人网站?  动图在线制作网站有哪些,滑动动图图集怎么做?  如何获取PHP WAP自助建站系统源码? 

您的项目需求

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