简单静态代理与动态代理

静态:
首先需要一个接口
public interface Neting {

 public void netting();
 
 public String playGame(String name);
}
然后需要一个实例去继承:

public class NetImpl implements Neting {

 @Override
 public void netting() {
  System.out.println("上网中....");
 }

 @Override
 public String playGame(String name) {
  System.out.println("游戏中....");
  return "game over";
 }

}

最后需要一个同样实现了相同接口的类来做代理,并在每个方法中加入需要的操作:

public class NetingImplProxy implements Neting {

 private Neting neting;
 
 public NetingImplProxy(Neting neting){
  this.neting=neting;
 }
 @Override
 public void netting() {
  this.up();
  neting.netting();
  this.down();
 }

 @Override
 public String playGame(String name) {
  this.up();
  String str=neting.playGame(name);
  this.down();
  return str;
 }
 
 private void up(){
  System.out.println("拨号中");
 }
 
 private void down(){
  System.out.println("断开中");
 }

}

这样产生的结果是每次更改方法中固定的操作时,都需要更改类的源代码,带来很多不便,由此产生动态代理。
动态代理需要一个Proxy类和invocationhandle接口来支持:

同样,上述的接口和实现类都不变,不再需要代理类,而是由下面这个类动态产生:
public class NetHandle implements InvocationHandler {
 
 //首先需要传一个目标对象的引用
 private Object targetObject;
 
//设置构造方法时,直接将目标对象作为参数传入
 public NetHandle(Object targetObject){
  this.targetObject=targetObject;
 }
 
 //这是至关重要的,由此类实例的本方法产生一个$...代理对象:
 public Object createProxyInstance(){
  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
           targetObject.getClass().getInterfaces(), 
           this);
  
 }
//代理对象会自动调用复写后的invoke方法,类似filter中的dofilter;
 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  up(); //在此加入需要增加的操作
  Object ret=method.invoke(targetObject, args);
  down();//在此加入需要增加的操作
  return ret;// 如果没有返回值,则返回null。
 }
 
 private void up(){
  System.out.println("拨号中");
 }
 
 private void down(){
  System.out.println("断开中");
 }
}
测试:
 public static void main(String[] args) {
  
  NetHandle n=new NetHandle(new NetImpl());
  Neting net=(Neting) n.createProxyInstance();
  net.netting();
  System.out.println(net.playGame(""));
 }
运行结果:
拨号中
上网中....
断开中
拨号中
游戏中....
断开中
game over

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-28 12:24:11

简单静态代理与动态代理的相关文章

关于java中的静态代理和动态代理的疑问

问题描述 本人java还未入门者,看到java的反射这一块,里面介绍java的静态代理和动态代理,看的一知半解,有点没想明白的是,动态代理相对于静态代理到底有哪些优势,使用反射机制生成动态代理类,能实现的功能,用静态代理类也可以实现.动态代理不需要写代理类,但是需要写InvocationHandler类,以我的观点看,使用动态代理反而使代码更加难以理解.还请各位大侠给以指点,不胜感激! 解决方案 说一下我对这个问题的看法吧.代理应用的情况有以下几种: 访问控制 远程访问 加载开销比较大的资源(加

Java动态代理学习2——静态代理和动态代理并对照spring的通知

  一.代理模式  代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务.  按照代理的创建时期,代理类可以分为两种: 静态代理:由程序员创建或特定工具自动生成源代码再对其编译.在程序运行前代理类的.class文件就已经存在了. 动态

静态代理与动态代理

           记得刚接触代理,是在大话设计模式,最近在技术总结和学些java的过程又接触到静态代理和动态代理,尤其是动态代理,在学习AOP时,用到了动态代理,下面我用一些例子来对静态代理和动态代理做个总结.          其实用了代理之后最大的好处就是隐藏了真实类(委托类),这样更加安全,而静态代理和动态代理最大的区别就是,静态代理的代理类是程序员自己写的,在程序运行之前就已经存在的,而动态代理则是在程序运行时动态生成的,而且因为动态代理更加灵活,也常被应用.           首

深入解析java中的静态代理与动态代理_java

java编码中经常用到代理,代理分为静态代理和动态代理.其中动态代理可以实现spring中的aop. 一.静态代理:程序运行之前,程序员就要编写proxy,然后进行编译,即在程序运行之前,代理类的字节码文件就已经生成了 被代理类的公共父类 复制代码 代码如下: package staticproxy;public abstract class BaseClass {    public abstract void add();} 被代理类 复制代码 代码如下: package staticpro

静态代理与动态代理二

               动态代理的实现是基于java的三种API的,下面先来介绍一下:            1.java.lang.reflect.Proxy             这是 Java 动态代理机制生成的所有动态代理类的父类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象.           <span style="font-size:14px;">// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器 static Invoca

代理模式-动态代理

package pattern.proxy.dynamic; import java.lang.reflect.Proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 代理模式:Proxy Pattern * Java对代理模式的支持: * java.lang.reflect.Proxy.java.lang.reflect.InvocationHandler. * @ver

【动态代理】动态代理Proxy_04

我们继续上一篇总结. 上篇我们说到,怎么让before()和after()中的内容也让客户灵活指定? 不管怎么样,我们现在需要一个这样的东西:可以动态指定对方法进行处理的指令. 我们创建一个方法调用的处理器,用来对任意方法进行自定义的处理: package cn.edu.hpu.proxy; import java.lang.reflect.Method; //方法调用的处理器 public interface InvocationHandler { //你只要给我一个Method方法,我就能对

java代理 jdk动态代理应用案列_java

java代理有jdk动态代理.cglib代理,这里只说下jdk动态代理,jdk动态代理主要使用的是java反射机制(既java.lang.reflect包) 原理是(歌手.经纪人做例子): 建立一个公共的接口,比如:歌手public interface Singer: 用具体的类实现接口,比如:周杰伦,他是歌手所以实现Singer这个类,class MySinger implements Singer 建立代理类,这里也就是经纪人,他需要实现InvocationHandler类,并重写invok

【SSH系列】静态代理&amp;amp;&amp;amp;动态代理

从设计模式说起 代理模式是二十三中设计模式中的一种,代理模式就是指由一个代理主题来操作真实的主题,真实的主题执行具体的业务操作,而代理主题负责其她相关业务,简而言之,代理模式可以由以下三个部分组成: a.抽象角色:通过接口或抽象类声明真实角色实现的业务方法. b.代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作. c.真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用.第一次接触代理模式的是在学习大话设计模式的时候,首先