最近看《深入浅出MyBatis技术原理与实战》这本书时,里面讲到Mapper接口的内部实现是通过JDK动态代理生成实现类,联想到之前看《SPRING技术内幕》这本书里也常常提到JDK动态代理,之前自己也转载过动态代理的文章,但一直印象不深,这次就亲自动手写个动态代理的实例。

1.目标类接口

这个可以说是JDK动态代理的一个缺陷,就是目标类必须要实现一个接口类,才能实现动态代理,对于没有接口实现的目标类,可以通过cglib来实现动态代理。

public interface HelloService {

    void sayHello();
}

2.目标类的实现

public class HelloServiceImpl implements HelloService {

    public void sayHello() {
System.out.println("hello world");
}
}

实现类中只有一个sayHello方法,方法内打印一句"hello world",简单。

3.生成代理类的实现(JDK动态代理技术

public class DynamicProxyFactory implements InvocationHandler {

    /**
* 目标对象
*/
public Object target; /**
* 生成代理类
*/
public Object createProxyInstance(Object target) {
// 目标对象赋值
this.target = target;
// 生成代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
this);
}
/**
* 代理类中方法拦截
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 目标方法调用前
System.out.println("++++ before invoke ++++");
// 目标方法调用
Object result = method.invoke(target, args);
// 目标方法调用后
System.out.println("++++ after invoke ++++");
return result;
}
}

3.测试

public class Test {

    public static void main(String[] args) {
DynamicProxyFactory serviceProxy = new DynamicProxyFactory();
HelloService helloService = (HelloService) serviceProxy.createProxyInstance(new HelloServiceImpl()); helloService.sayHello();
}
}

以下是执行测试类的输出结果:

++++ before invoke ++++
hello world
++++ after invoke ++++

JDK动态代理实例的更多相关文章

  1. JDK动态代理与CGLib动态代理相关问题

    导读: 1.JDK动态代理原理是什么?为什么不支持类的代理? 2.JDK动态代理实例 3.CGLib代理原理是什么? 4.CGLib代理实例 5.JDK动态代理与CGLib代理的区别是什么? 6.总结 ...

  2. 解析JDK动态代理实现原理

    JDK动态代理使用实例 代理模式的类图如上.关于静态代理的示例网上有很多,在这里就不讲了. 因为本篇讲述要点是JDK动态代理的实现原理,直接从JDK动态代理实例开始. 首先是Subject接口类. p ...

  3. 一个简单JDK动态代理的实例

    动态代理的步骤: 创建一个实现了InvocationHandler接口的类,必须重写接口里的invoke()方法. 创建被代理的类和接口 通过Proxy的静态方法 newProxyInsatance( ...

  4. 一个简单 JDK 动态代理的实例

    动态代理的步骤: 创建一个实现了 InvocationHandler 接口的类,必须重写接口里的 invoke()方法. 创建被代理的类和接口 通过 Proxy 的静态方法 newProxyInsat ...

  5. JDK和Cglib实现动态代理实例及优缺点分析

    Spring AOP使用的核心技术是动态代理,说到动态代理就不得不和设计模式中的代理模式联系起来,通过代理模式我们可以对目标类进行功能增强,在某个方法的执行前后增加一些操作,例如计算方法执行效率.打印 ...

  6. JDK动态代理

    一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...

  7. 静态代理和利用反射形成的动态代理(JDK动态代理)

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

  8. Spring中的JDK动态代理

    Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层 ...

  9. Java中的JDK动态代理

    所谓代理,其实就是相当于一个中间人,当客户端需要服务端的服务时,不是客户直接去找服务,而是客户先去找代理,告诉代理需要什么服务,然后代理再去服务端找服务,最后将结果返回给客户. 在日常生活中,就拿买火 ...

随机推荐

  1. background 的一些 小的细节: 1, 背景色覆盖范围: border+ width+ padding ;背景图覆盖范围: width + padding ; 2设置多个背景图片 ; 3) background-position定位百分比的计算方式: 4)background-clip 和 background-origin 的区别

    1. background (background-color, background-image)  背景色覆盖范围: border+ width+ padding ;背景图覆盖范围: width ...

  2. ios遮罩层的简单使用

    /** 大图 */ - (IBAction)bigImg { //1.添加按钮遮罩层 UIButton *cover=[[UIButton alloc] init]; cover.frame=self ...

  3. Linux下的shell与make

    Linux下的shell与make 一.shell 1.1 什么是shell ● 用户与Linux的接口 ● 命令解释器 ● 支持多用户 ● 支持复杂的编程语言 ● Shell有很多种,如:csh,t ...

  4. POJ 2369 Permutations(置换群概念题)

    Description We remind that the permutation of some final set is a one-to-one mapping of the set onto ...

  5. matlab调用规则变量名eval函数

    eval 函数运用!! 经常会遇到matlab里面有些变量命名其实有一样的规律,,但是不像矩阵这些是可以通过循环来获取的,这个时候就可以利用eval语句了:   首先,假设现在有10个名称类似的变量, ...

  6. RESTful Service API 常见问题解决方案

    REST 风格的优秀设计应该像下面这些: - GET /users 获取所有用户 - GET /users/1234 获取ID为1234的用户 - POST /users 创建一个新用户 - PUT ...

  7. mysql 批量kill

    select concat('kill ',id,';') t  from information_schema.processlist  order by t

  8. shapefile 转 geojson 文件类型

    http://mapshaper.org/ 从natural earth下载后,扔进去2个文件,就可以了.

  9. MongDB篇,第一章:数据库知识1

    MongDB    数据库知识1 程序 =  数据结构 + 算法 数据存储阶段 1,文件管理阶段 (.txt .doc .xls) 优点: 数据可以长期保存:可以存储大量的数据:使用简单     缺点 ...

  10. Flask中的Templates

    1.什么是模板 模板 , 在Flask 中就是允许响应给用户看的网页 在模板中,允许包含"占位变量"来表示动态的内容 模板最终也会被解析成字符串再响应给客户端,这一过程通常称为&q ...