静态代理与动态代理

         

 记得刚接触代理,是在大话设计模式,最近在技术总结和学些java的过程又接触到静态代理和动态代理,尤其是动态代理,在学习AOP时,用到了动态代理,下面我用一些例子来对静态代理和动态代理做个总结。

         其实用了代理之后最大的好处就是隐藏了真实类(委托类),这样更加安全,而静态代理和动态代理最大的区别就是,静态代理的代理类是程序员自己写的,在程序运行之前就已经存在的,而动态代理则是在程序运行时动态生成的,而且因为动态代理更加灵活,也常被应用。

          首先先用一张UML图来理解一下代理是怎么回事?

          

        其实静态代理就是在代理类中放入对为委托类的引用,然后将委托类作为代理类的构造函数的参数,这样在客户端调用时就不会看到委托类了。         

1、公共接口,委托类和代理类都来集成它,这样代理类就具有了委托类所有的方法和属性

/*****************公共接口**********************/
public interface ITest {
	 public void addStudent(String Name);
}

2、委托类,对接口的实现

/******************委托类**********************/
public class Test implements ITest {

	/**
	 * 执行给定名字的任务。这里打印出学生姓名,并休眠500ms模拟任务执行了很长时间
	 */
	@Override
	public void addStudent(String Name) {
		 System.out.println("学生姓名:"+Name);
	      try {
	         Thread.sleep(500);
	      } catch (InterruptedException e) {
	         e.printStackTrace();
	      }

	}

}

3、代理类,将委托类的行为表现出来

/**************代理类*******************/
public class ProxyTest implements ITest {

	// 代理类持有委托类的引用
	<span style="color:#ff0000;">private Test delegate;</span>

	public ProxyTest(<span style="color:#ff0000;">Test delegate</span>) {
		this.delegate = delegate;
	}

	/**
	 * 将请求分派给委托类执行,记录任务执行前后的时间,时间差即为任务的处理时间
	 */
	@Override
	public void addStudent(String Name) {
		long stime = System.currentTimeMillis();
		// 将请求分派给委托类处理
		delegate.addStudent(Name);
		long ftime = System.currentTimeMillis();
		System.out.println("执行任务耗时" + (ftime - stime) + "毫秒");

	}

}

4、代理类工厂

/******** 代理类工厂 ********/
public class TestFactory {
	public static ITest getInstance() {
		//对客户类来说,其并不知道返回的是代理类对象还是委托类对象
		return new ProxyTest(new Test());
	}

}

5、客户端调用

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ITest proxy = TestFactory.getInstance();
		 proxy.addStudent("好学生");  

	}

}

         那静态代理有什么优缺点呢?为什么会有动态代理产生呢?

         优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
         缺点:
                  1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
                 2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度 

          而动态代理恰恰弥补了静态代理的缺点,下面看下动态代理:静态代理与动态代理二

       

时间: 2025-01-11 18:58:47

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

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

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

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

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

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

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

简单静态代理与动态代理

静态: 首先需要一个接口 public interface Neting {  public void netting();    public String playGame(String name); } 然后需要一个实例去继承: public class NetImpl implements Neting {  @Override  public void netting() {   System.out.println("上网中....");  }  @Override  pu

静态代理与动态代理二

               动态代理的实现是基于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.真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用.第一次接触代理模式的是在学习大话设计模式的时候,首先