在是上一篇博客中实现了静态代理。

在上篇的结尾提到了一个问题:

思考:如果我们下需要对火车,自行车实现相同的代理,我们又该如何实现呢?

这篇博客就来解决这个问题:

解决这类问题需要用到动态代理技术,实现对不同的类,不同方法的代理

1,动态代理的实现方式:

动态代理其实就是在代理类和被代理类之间加入了InvocationHandler类(事物处理器),像我们的时间处理,日志处理都是在事物处理器中完成的。

(1)InvocationHandler中只有一个方法:invoke方法,

这个方法有三个参数:

Object:被代理类

Memthod:被代理的方法

Object[]:方法的参数数组

(2)Proxy:产生动态代理的类

通过newProxyInstance()可以产生一个动态代理类

(3)代码实现

package com.songyan.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; import javax.interceptor.InvocationContext; /**
* 时间处理器
* @author sy
*
*/
public class TimeHandler implements InvocationHandler
{
//构造器,传递参数
private Object target; public TimeHandler(Object target) {
this.target=target; } /**
* @param proxy:被代理的对象
* @param method:被代理对象的方法
* @param args:被代理对象的参数
*
* @return Object:调用方法的返回值
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("时间记录开始~~"); //直接调用被代理对象的方法
method.invoke(target); System.out.println("时间记录结束~~");
return null;
} }
package com.songyan.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; import com.songyan.proxy.Car;
import com.songyan.proxy.Moveable; public class DyTest {
public static void main(String[] args) {
Car car=new Car();
//创建事务处理器
InvocationHandler timeHandler= new TimeHandler(car);
Class cla=car.getClass();
/**
* 第一个参数:loader类加载器
* 第二个参数:interfaces实现接口
* 第三个参数:h InvocationHandler
*/
//动态创建代理类
Moveable m=(Moveable) Proxy.newProxyInstance(cla.getClassLoader(), cla.getInterfaces(), timeHandler);
m.move();
}
}

(4)总结一下

动态代理首先是被代理对象首先要实现某些接口,在运行的时候产生了一个Class对象,就是我们的代理类

然后声明一个Handler来接管我们实际的工作(比如说我们要实现的日志的功能是在handler里面实现的)

(5)动态代理的实现步骤

  1)创建一个实现了InvocationHandler接口的类(事务处理器i),他必须实现invoke方法,在这个方法中实现逻辑代码

  2)创建被代理的类以及接口

  3)调用Proxy中的静态方法newProxyInstance创建一个代理类

  4)通过代理调用方法

(6)作业:在上面的基础上试下功能的叠加(代理不仅能记录时间更能记录日志)

在上面代码的基础上添加以下代码

S1:记录日志的代理类

package com.songyan.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; /**
* 记录日志的代理类
* @author sy
*
*/
public class LogHandler implements InvocationHandler {
private Object obj; /**
* 通过构造函数传值
* @param obj
*/
public LogHandler(Object obj)
{
this.obj=obj;
} /**
*编写逻辑代码
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("log start ~~~");
method.invoke(obj);
System.out.println("log end~~");
return null;
} }

S2:测视类

package com.songyan.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; import com.songyan.proxy.Car;
import com.songyan.proxy.Moveable; public class DyTest {
public static void main(String[] args) {
Car car=new Car();
//创建记录时间的事务处理器
InvocationHandler timeHandler= new TimeHandler(car);
Class cla=car.getClass();
//获得记录时间的代理
Moveable timeProxy=(Moveable) Proxy.newProxyInstance(cla.getClassLoader(), cla.getInterfaces(), timeHandler);
//创建记录日志的事物处理器
InvocationHandler logHandler= new LogHandler(timeProxy);
//获得记录日志的代理
Moveable logProxy=(Moveable) Proxy.newProxyInstance(cla.getClassLoader(), cla.getInterfaces(), logHandler);
//通过代理完成操作
logProxy.move();
}
}

缺点:被代理的对象必须实现接口才能产生代理对象,如果没有接口将不能使用动态代理技术(没有实现接口的对象可以使用CGLIB技术产生代理对象)

动态代理的第二种实现实现方式:CGLIB

代理模式(Proxy)--动态代理(JDK)的更多相关文章

  1. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  2. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  3. java代理模式及动态代理类

     1.      代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...

  4. 代理模式与动态代理之JDK实现和CGlib实现

    静态代理 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. 由业务实现类.业务代理类 两部分组成.业务实现类 负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截.过滤.预处理, ...

  5. Java的三种代理模式(Spring动态代理对象)

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  6. JAVA代理模式与动态代理模式

    1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某 ...

  7. Java代理模式之动态代理

    动态代理类的源码是程序在运行期间由JVM根据反射等机制动态生成的,所以不存在代理类的字节码文件.代理角色和真实角色的联系在程序运行时确定! Java中有两种动态代理,一种是JDK自带的,另一种的CGL ...

  8. 《Java设计模式》之代理模式 -Java动态代理(InvocationHandler) -简单实现

    如题 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式可细分为如下, 本文不做多余解释 远程代理 虚拟代理 缓冲代理 保护代理 借鉴文章 ht ...

  9. Java 中的代理模式及动态代理

    原文:https://blog.csdn.net/briblue/article/details/73928350

  10. 23种java设计模式之装饰者模式及动态代理

    设计模式不管对于何种语言都是存在的,这里介绍的是java的模式 装饰者模式是在二次开发中应用比较多的一款模式,当然了用反射也是可以实现的,今天介绍的是装饰模式,有兴趣的朋友可以自己去了解一下反射是怎么 ...

随机推荐

  1. 【转载】Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放

    前几篇文章介绍了很多Unity3D引擎自身的一些问题, 今天我们在回到IOS设备上讨论一些触摸屏幕手势,本章的目标是通过触摸iPhone屏幕手势 实现模型左右的旋转,与模型的缩放. 大家想一想模型的旋 ...

  2. [C++] 拓展属性

    inline函数 函数重载 占位参数和默认参数 /*__________________________________________________________________ 背景: C++ ...

  3. EasyUi DataGrid 请求Url两次问题

    easyui datagrid 1.4 当total为0时,请求两次url问题 框架问题:需要在easyui文件后加修补补丁 /** * The Patch for jQuery EasyUI 1.4 ...

  4. Learn the shell

    learn the shell what is the shell? when we speak of the command line,we are really to the shell.Actu ...

  5. winform 使用Anchor属性进行界面布局

    每个控件的定位方法: 一.使用Anchor: Anchor分为Left.Top.Right.Bottom四个属性. 它们的含义如下: Top——表示控件中与父窗体(或父控件)相关的顶部应该保持固定. ...

  6. 洛谷 P2197 【模板】nim游戏 解题报告

    P2197 [模板]nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以 ...

  7. poj 1037 三维dp

    A decorative fence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7221   Accepted: 272 ...

  8. mysql插入表情问题

    http://blog.csdn.net/wxc20062006/article/details/19547179http://blog.csdn.net/xb12369/article/detail ...

  9. jira7.3/7.2安装、中文及破解

    jira是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪(bug管理).客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域. 现在我们来介绍,有关jira安装. ...

  10. 一键GHOST

    软件简介: 一键GHOST是"DOS之家"首创的4种版本(硬盘版/光盘版/优盘版/软盘版)同步发布的启动盘,适应各种用户需要,既可独立使用,又能相互配合.主要功能包括:一键备份系统 ...