代理模式概述

代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色。

java中常用的动态代理模式为jdk动态代理和cglib动态代理。

反射技术

了解动态代理之前,需要先了解一下java中的反射,反射在框架中的应用非常广泛,它能够配置:类的全限定名,方法和参数。在运行时,动态的完成类的初始化,或者反射调用某些方法。

我们可以通过Class.forName()方法加载类,并用getConstructor方法配置参数。例:

object = (goodsServiceImpl)=Class.forName("com.xjx.test.goodsServiceImpl").getConstructor(String.class).newInstance("计算机");

1. jdk动态代理举例

jdk动态代理由java.lang.reflect.*包提供,它必须借助一个接口才能实现代理。

我们举个例子来实现jdk动态代理并简要分析:

首先我们定义一个接口:

public interface jdkProxy {
public void test(String tString);
}

以及它的实现类:

public class jdkProxyImpl implements jdkProxy{
@Override
public void test(String tString) {
// TODO Auto-generated method stub
System.out.println("代理内方法"+tString);
}
}

接下来我们要进行代理。代理过程分2步:

1.建立起代理对象和真实服务对象之间的关系,生产代理对象;

2.实现逻辑的代理;

在jdk动态代理中,要实现代理逻辑就必须实现InvocationHandler接口。它里面定义了一个invoke方法,每当我们通过代理对象调用方法时,它都会被转发到这个invoke方法,我们来

定义一个实现代理逻辑的类:

public class jdkProxyExample implements InvocationHandler{
//真实对象
private Object target = null;
/**
* 建立真实对象和代理对象的代理关系
* @param target真实对象
* @return 代理对象
*/
public Object setTargetAndBind(Object target) {
this.target = target;
/**
* 参数1:getClassLoader()提供类加载器;
      参数2:getInterfaces()要挂载动态代理对象的接口,就是target的接口;
*/
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);
}
/**
* 代理方法逻辑
* @param:代理对象
* method:当前调度方法
* args:当前方法参数
* return 代理结果返回
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("进入代理对象方法,在此执行代理对象之前的一些操作");
//执行目标对象中的某个方法
Object object = method.invoke(target, args);
System.out.println("调用代理对象方法之后的操作");
return object;
}
}
1.1 生成一个代理对象

setTargetAndBind()这个方法内的newProxyInstance()方法通过传入被代理内,再通过反射,生成一个代理类。

1.2 实现代理类的逻辑方法

object obj = method.invoke(target,args),这个方法相当于调度真实对象的方法,只不过是通过反射区实现。它返回方法的执行结果。

并且在invoke方法里,可以在调用真实对象方法之前和之后做一些其他的操作,这也是AOP的实现原理

这样,一个jdk动态代理就完成了,接下来可以写个测试类测试一下:

public class jdkProxyExampleTest {

    @Test
public void testProxy() {
jdkProxyExample jdkProxyExample = new jdkProxyExample();
//绑定关系,此时jdkProxy已经是一个代理对象
jdkProxy jdkProxy = (jdkProxy)jdkProxyExample.setTargetAndBind(new jdkProxyImpl());
//执行代理对象方法
jdkProxy.test("动态代理jdk");
}
}

打印结果如下:

2. 为什么jdk动态代理一定需要目标对象实现接口?(可能有误)

1.我们可以看到,在绑定关系的方法中,实现被代理类的反射,需要我们提供接口,然后它通过接口实现代理类。没有它就找不到反射的方法。

2.由于java的单继承机制:首先jdk动态代理是通过newInstance动态的生成代理对象的,newInstance通过ProxyGenerator生成的字节码代表的类继承了Proxy类:

public final class $Proxy0 extends Proxy
implements jdkProxy{
...
}
$Proxy0这个类通过反编译获得,它就是jdkProxy的实现类的动态的代理类。
由于java的单继承机制,被代理对象不能再被其他的类继承,那么我们如果想建立代理类和被代理类之间的关系,只能通过实现同一个接口了。

java jdk动态代理模式举例浅析的更多相关文章

  1. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

  2. Spring代理模式(jdk动态代理模式)

    有动态代理和静态代理: 静态代理就是普通的Java继承调用方法. Spring有俩种动态代理模式:jdk动态代理模式 和 CGLIB动态代理 jdk动态代理模式: 代码实现: 房东出租房子的方法(继承 ...

  3. Java JDK 动态代理使用及实现原理分析

    转载:http://blog.csdn.net/jiankunking   一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理 ...

  4. Java,JDK动态代理的原理分析

    1. 代理基本概念: 以下是代理概念的百度解释:代理(百度百科) 总之一句话:三个元素,数据--->代理对象--->真实对象:复杂一点的可以理解为五个元素:输入数据--->代理对象- ...

  5. Java JDK 动态代理实现和代码分析

    JDK 动态代理 内容 一.动态代理解析 1. 代理模式 2. 为什么要使用动态代理 3. JDK 动态代理简单结构图 4. JDK 动态代理实现步骤 5. JDK 动态代理 API 5.1 java ...

  6. Java JDK动态代理解析

    动态代理虽不常自己实现,但在Spring或MyBatis中都有重要应用.动态代理的意义在于生成一个占位(又称代理对象),来代理真实对象,从而控制真实对象的访问.Spring常JDK和CGLIB动态代理 ...

  7. java jdk动态代理学习记录

    转载自: https://www.jianshu.com/p/3616c70cb37b JDK自带的动态代理主要是指,实现了InvocationHandler接口的类,会继承一个invoke方法,通过 ...

  8. java jdk动态代理

    在面试的时候面试题里有一道jdk的动态代理是原理,并给一个事例直接写代码出来,现在再整理一下 jdk动态代理主要是想动态在代码中增加一些功能,不影响现有代码,实现动态代理需要做如下几个操作 1.首先必 ...

  9. Java JDK 动态代理(AOP)使用及实现原理分析

    一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式U ...

随机推荐

  1. SpringMVC接口测试异常:Can not deserialize instance of int out of START_OBJECT token

    之前使用springmvc搭建了restful风格的接口服务,在使用mockmvc进行集成测试的时候出现了异常:Can not deserialize instance of int out of S ...

  2. js术语扫盲贴:XHR、RegExp、call-apply、prototype

    (1) XHR:xml httprequestXHR注入:XHR 注入技术是通过XMLHttpRest来获取javascript的.但与eval不同的是,该机制是通过创建一个script的DOM元素, ...

  3. Android 手势锁的实现 让自己的应用更加安全吧

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/36236113 今天偶遇以github上gesturelock关于手势锁的一个例子 ...

  4. CSS操作笔记

    编写css样式:1. 标签的style属性2. 写在head里面 style标签中写样式- id选择区#i1{background-color: #2459a2;height: 48px;}- cla ...

  5. 搭建 vue2 单元测试环境(karma+mocha+webpack3)

    从网上找了很多例子关于单元测试,都是如何新建项目的时候的添加单元测试,用vue-cli中怎么添加,但是我的项目已经生成了,不能再一次重新初始化,这时如何添加单元测试,这里面遇到了好多坑,写在这里记录一 ...

  6. 使用Eclipse远程调试

    在一般的开发中,有事因为项目需要,测试环境是在Linux下,这是如果出现异常或者bug,调试起来都是很费劲的,如果你还在为这个头疼,那就好好看接下来的总结 1,启动改程序时,不论是脚本启动,还是tom ...

  7. BZOJ_1031_[JSOI2007]字符加密Cipher_后缀数组

    BZOJ_1031_[JSOI2007]字符加密Cipher_后缀数组 Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把 ...

  8. 实验吧——隐写术之复杂的QR_code

    好久没有更新隐写术方面的题目了,对不起各位小可爱,今天我会多多更新几篇文章,来慰藉你们! 永远爱你们的 ---------新宝宝 1:复杂的QR_code 解题思路:保存图片之后使用在线解码工具,并没 ...

  9. 【SAP业务模式】之STO(一):业务背景和前台操作

    所谓STO即两个关联公司之间的库存转储交易,一家公司发出采购订单向另一家公司做采购,然后在做发货.如此之后,两家公司有相应应收应付的票据,以及开票和发票校验等动作. STO分为一步法与两步法,因为一步 ...

  10. 从壹开始前后端分离 42 ║支持多种数据库 & 快速数据库生成

    缘起 哈喽大家周三好,休息了一段时间,打算准备找工作了