Java-动态代理-初步

一、概述

1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换

2.思路:

(1)聚合:由于代理类及被代理类都实现了movable接口,代理类聚合了被代理类,所以可以灵活多变,具体看代码

(2)继承:继承不够灵活,具体看代码

二、代码

1.Movable.java

2.Tank.java

3.TankTimeProxy.java

4.TankLogProxy.java

5.Tank2Time.java

6.Tank3Log.java

7.Client.java

1.Movable.java

1 public interface Movable {
2     public void move();
3 }

2.Tank.java

 1 import java.util.Random;
 2
 3 public class Tank implements Movable {
 4
 5     @Override
 6     public void move() {
 7         System.out.println("Tank moving.......");
 8         try {
 9             Thread.sleep(new Random().nextInt(5000));
10         } catch (InterruptedException e) {
11             e.printStackTrace();
12         }
13     }
14
15 }

3.TankTimeProxy.java

 1 public class TankTimeProxy implements Movable {
 2
 3     Movable m;
 4
 5     public TankTimeProxy(Movable m) {
 6         this.m = m;
 7     }
 8
 9     @Override
10     public void move() {
11         System.out.println("Time Proxy start...........");
12         long start = System.currentTimeMillis();
13         m.move();
14         long end = System.currentTimeMillis();
15         System.out.println("花费时间:"+(end - start));
16         System.out.println("Time Proxy end...........");
17     }
18
19 }

4.TankLogProxy.java

 1 public class TankLogProxy implements Movable {
 2
 3     Movable m;
 4
 5     public TankLogProxy(Movable m) {
 6         this.m = m;
 7     }
 8
 9     @Override
10     public void move() {
11         System.out.println("Log Proxy start...........");
12         m.move();
13         System.out.println("Log Proxy end...........");
14     }
15
16 }

5.Tank2Time.java

 1 public class Tank2Time extends Tank {
 2
 3     public void move(){
 4         System.out.println("Tank2 time  start...........");
 5         long start = System.currentTimeMillis();
 6         super.move();
 7         long end = System.currentTimeMillis();
 8         System.out.println("花费时间:"+(end - start));
 9         System.out.println("Tank2 time end...........");
10     }
11 }

6.Tank3Log.java

1 public class Tank3Log extends Tank2Time {
2
3     public void move(){
4         System.out.println("Tank3Log  start...........");
5         super.move();
6         System.out.println("Tank3Log  end...........");
7     }
8 }

7.Client.java

 1 public class Client {
 2
 3     @Test
 4     public void testProxy(){
 5
 6         Tank t = new Tank();
 7         Movable m;
 8
 9         //一、聚合的方式(较灵活,因为实现了接口)
10         //1.1聚合方式的代理,先日志代理,后时间代理
11         TankTimeProxy ttp1 = new TankTimeProxy(t);
12         TankLogProxy tlp1 = new TankLogProxy(ttp1);
13
14         m = tlp1;
15         m.move();
16
17         System.out.println("\n==============================分隔线==========================\n");
18
19         //1.2聚合方式的代理,先时间代理,后日志代理(可以灵活切换顺序)
20         TankLogProxy tlp2 = new TankLogProxy(t);
21         TankTimeProxy ttp2 = new TankTimeProxy(tlp2);
22
23         m = ttp2;
24         m.move();
25
26         System.out.println("\n==============================分隔线==========================\n");
27
28         //二、继承的方式
29         //2.1代理时间
30         Tank2Time t2 = new Tank2Time();
31         t2.move();
32
33         System.out.println("\n==============================分隔线==========================\n");
34
35         //2.2先代理日志,后时间,不能灵活切换
36         Tank3Log t3 = new Tank3Log();
37         t3.move();
38
39
40
41     }
42 }

三、运行结果

四、小结

凡是要求灵活多变的功能,多数用接口多态实现

时间: 2024-11-06 07:17:58

Java-动态代理-初步的相关文章

Java动态代理-实战

Java动态代理-实战 只要是写Java的,动态代理就一个必须掌握的知识点,当然刚开始接触的时候,理解的肯定比较浅,渐渐的会深入一些,这篇文章通过实战例子帮助大家深入理解动态代理. 说动态代理之前,要先搞明白什么是代理,代理的字面意思已经很容易理解了,我们这里撇开其他的解释,我们只谈设计模式中的代理模式 什么是代理模式(Proxy) 定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用 在代理模式中,是需要代理对象和目标对象实现同一个接口(如果是不同的接口,那就是适配器模式了),看

理解java动态代理

java动态代理是java语言的一项高级特性.在平时的项目开发中,可能很难遇到动态代理的案例.但是动态代理在很多框架中起着不可替代的作用,例如Spring的AOP.今天我们就聊一聊java动态代理的实现原理. jdk对于动态代理的支持主要依赖于两个类:Proxy和InvocationHandler.我们先看一下类图. Subject类是主题类,定义了我要做什么.我们需要代理的类即实现Subject接口的RealSubject. 1.InvocationHandler InvocationHand

java动态代理的实现

动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy).那么有没有一种机制能够让系统在运行时动态创建代理类?答案就是本文将要介绍的动态代理(Dynamic Proxy).动态代理是一种较

java动态代理机制

首先了解代理设计模式,其思想是为其他对象提供一种代理以控制对这个对象的访问. java动态代理就是遵循这种思想,spring中的AOP实现原理就是java的动态代理. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的. 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通

java动态代理

要想了解Java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有一种叫做代理(Proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式. 在我看来所谓的代理模式,和23种设计模式中的"装饰模式"是一个东西.23种设计模式中将它们作为两种模式,网上也有些文章讲这两种模式的异同,从细节来看,确实可以人为地区分这两种模式,但是抽象到一定高度后,我认为这两种模式是完全一样的.因此学会了代理模式,也就同时掌握了装饰模式. 代理模式 代理模

java 动态代理示例,带主要注释

Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interface Subject { String hello(String name); void say();} 接口实现: public class ImpSubject implements Subject { @Override public String hello(String name){ r

java动态代理原理及解析

代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(Spring的AOP机制),设计上获得更大的灵活性. java动态代理的类和接口(jdk1.6源码) 1,java.lang.reflect.Proxy:动态代理机制的主类,提供一组静态方法为一组接口动态的生成对

彻底理解JAVA动态代理

注:本文转自 http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html 代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 代理模式的结构如下图所示. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Subject { public void doSomething(); } public class RealSubject i

JAVA动态代理详解

1.什么是代理 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 2.什么是动态代理 在程序运行时,运用反射机制动态创建代理实例对象.JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理. 相关类与接口 java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象. //

java 动态代理 , 多看看。 多用用。

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.lang.reflect.Method; //抽象角色:java动态代理的实现目前只支持接口,不支持抽象类 interface BusinessFoo { void foo(); } interface BusinessBar { String bar(String message); } //真实角色:真正实现业务逻辑方