一、在java中怎样实现动态代理

1、我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象

接口:

 package org.dynamicproxy.test;

 public interface UserDao {
public void addUser(User user);
}

接口的实现类(即要代理的对象):

 package org.dynamicproxy.test;

 public class UserDaoMysqlImpl implements UserDao {

     public void addUser(User user) {
// TODO Auto-generated method stub
System.out.println("connect to MySQL DataBase...");
System.out.println("id为"+user.getId()+"的用户信息成功添加到数据库表中...");
} }

顺便说下,所谓代理呢也就是在调用实现类的方法时,可以在方法执行前后做额外的工作,这个就是代理。

2、我们要自己写一个在要代理类的方法执行时,能够做额外工作的类,而这个类必须继承InvocationHandler接口

处理类(即能够做额外工作的类):

 package org.dynamicproxy.test;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class LogHandler implements InvocationHandler {
// 持有被代理对象的引用(此引用可以有外部灵活制定的)
private Object target; public LogHandler(Object target) {
this.target = target;
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("开始记录日志,添加用户方法开始执行...");
method.invoke(target, args);
System.out.println("开始记录日志,添加用户方法执行结束...");
return null;
} }

顺便说下为什么要继承InvocationHandler接口呢?

因为代理类的实例在调用实现类的方法的时候,不会调真正的实现类的这个方法, 而是转而调用这个类的invoke方法(继承时必须实现的方法),在这个方法中你可以调用真正的实现类的这个方法。

3、用代理类的实例去调用实现类的方法。

 package org.dynamicproxy.test;

 import java.lang.reflect.Proxy;

 import org.junit.Test;

 public class TestProxy{

     @Test
public void testProxy(){
UserDao userDAO = new UserDaoMysqlImpl();
LogHandler li = new LogHandler(userDAO); //创建一个Handerler对象
  
UserDao userDAOProxy = (UserDao)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
userDAOProxy.addUser(new User("001")); }
}

newProxyInstance参数含义
* 第一个参数:代理的类加载器,必须和被代理的对象是一个类加载器
* 第二个参数含义:代理对象要实现的那些接口
* 第三个参数:指派方法调用的调用处理程序

代理调用过程
* 得到UserDaoMysqlImpl这个类的一个代理类userDAOProxy,同时为代理类绑定了一个处理类LogHandler li
* 每次调用UserDaoMysqlImpl这个子类的addUser方法时,
* 不是userDAO这个UserDaoMysqlImpl类的实例去调用,
* 而是这个UserDaoMysqlImpl的代理类userDAOProxy去调用它自己的invoke方法,
* 这个invoke方法里呢可以调用userDAO这个实例的addUser方法

所以说要实现java的动态代理,InvocationHandler接口和Proxy是必须要用到的。

java中动态代理的更多相关文章

  1. java中动态代理实现机制

    前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...

  2. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  3. Java中动态代理技术生成的类与原始类的区别 (转)

    用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...

  4. Java中动态代理技术生成的类与原始类的区别

    用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...

  5. Java中动态代理方式:

    JDK中生成代理对象的API 代理类所在包:java.lang.reflect.ProxyJDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是: st ...

  6. Java中动态代理实现原理深究

    一.前言 笔者平时开发使用“动态代理”不多,最近在看设计模式的时候,“动态代理”又在面前晃了几次,所以这次想从源码的角度去分析动态代理的实现原理,以窥探其精妙~ 二.正文 2.1 静态代理  本文源码 ...

  7. Java中动态代理技术生成的类与原始类的区别 (good)

    用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...

  8. java中动态代理的使用

    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代 ...

  9. Java中动态代理工作流程

    当谈到动态代理就会想到接口,因为接口是一种规范,动态代理对象通过接口便会很清楚地知道他的实现类(被代理对象)是何种类型的(即有哪些方法).Now,然我们来开始编写一个例子来了解动态代理的全过程: 第一 ...

随机推荐

  1. Fatal NI connect error 12170

    Fatal NI connect error 12170 转载:http://www.xifenfei.com/1812.html 今天在一台服务器的日志文件中,发现如下信息: Fatal NI co ...

  2. AJAX在GBK编码页面中传中文参数乱码的问题

    ---恢复内容开始--- 页面编码是GBK的情况下传递中文有乱码,解决方法如下: 在ajax传递前用若是Array,JSON,等其它对象,可用JSON.stringfy字符串序列化后,赋值给ajax传 ...

  3. ffmpeg+rtsp+dss

    1. push stream to dss ffmpeg -f mpegts -re -i film.v -c:v libx264 -s 352x288 -aspect 4:3 -b:v 300k - ...

  4. zoj 2723 Semi-Prime

    // 题意都不好理解 我以为是求 一个数被分成2个素数和 然后是求分成2个素数积// 坑爹 忘记写 !=EOF 然后一直超时 然后换了几种 还是超时 一看别人代码 速度明显比我慢// 然后发现被自己坑 ...

  5. delphi 对话框初始地址InitialDir

    我的电脑:SaveDialog1.InitialDir := '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}';// My Computer {20D04FE0-3 ...

  6. 通过userAgent判断手机浏览器类型

    我们可以通过userAgent来判断,比如检测某些关键字,例如:AppleWebKit*****Mobile或AppleWebKit,需要注意的是有些浏览器的userAgent中并不包含AppleWe ...

  7. spring3.0.5的aop使用

    spring3.0.5开始支持jpa2.0了,但是最近笔者在使用他的的时候发现了3.0.5的包与2.5.5相比,有所精简.其他外部的包,我们需要自己下载. AOP必须的spring包 org.spri ...

  8. Linux User's Manual IOSTAT

    IOSTAT(1) Linux User's Manual IOSTAT(1) NAME iostat - Report Central Processing Unit (CPU) statistic ...

  9. 【转】C++ 智能指针详解

    一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 ...

  10. [译]LINT TO SQL 介绍(数据库查询) - Part.3

    出处:Linq To Sql (Part.3 – Querying our database) 术语表 Built-in:内置的 Clause:子句 Debugger:调试器 Object Relat ...