代理类需实现InvocationHandler接口:

public interface InvocationHandler
{
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
}

其中参数:

proxy - 在其上调用方法的代理实例
method - 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。

返回值是从代理实例的方法调用返回的值。

运行时代理对象的产生(一般转换为接口使用):
Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), invocationHandler)

target.getClass().getClassLoader() - 代理类的类加载器
target.getClass().getInterfaces() - 代理类要实现的接口列表
invocationHandler - 实现了InvocationHandler的类的实例(方法调用的调用处理程序)

调用接口所声明的代理对象的方法时即调用了实现InvocationHandler接口的类的invoke方法(InvocationHandler接口成员)

动态代理是Spring AOP实现的原理,常用于异常,日志,性能检测,权限,事务

示例代码:

//UserProxy.Java

package com.xpp.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class UserProxy implements InvocationHandler { private Object target;//被代理对象 public Object bind(Object target) {
this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null; System.out.println(method.getName() + " call is starting"); result = method.invoke(target, args); System.out.println(method.getName() + " call ended");
return result;
}
}
//Client.Java
package com.xpp.client; import com.xpp.dao.UserDAO;
import com.xpp.dao.impl.UserDAOFileImpl;
import com.xpp.model.User;
import com.xpp.proxy.UserProxy; public class Client {
public static void main(String[] args) {
UserProxy up = new UserProxy();
UserDAO ud = (UserDAO) up.bind(new UserDAOFileImpl());
ud.AddUser(new User());
}
}

Java 第七天 动态代理的更多相关文章

  1. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  2. java反射机制与动态代理

    在学习HadoopRPC时.用到了函数调用.函数调用都是採用的java的反射机制和动态代理来实现的,所以如今回想下java的反射和动态代理的相关知识. 一.反射 JAVA反射机制定义: JAVA反射机 ...

  3. Java反射机制以及动态代理

    Java反射机制以及动态代理 Java反射机制 含义与功能 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类 ...

  4. Java中的JDK动态代理

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

  5. Java核心技术点之动态代理

    本篇博文会从代理的概念出发,介绍Java中动态代理技术的使用,并进一步探索它的实现原理.由于个人水平有限,叙述中难免出现不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.概述 1. 什么是代 ...

  6. Java设计模式系列之动态代理模式(转载)

    代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Sub ...

  7. JAVA提高八:动态代理技术

    对于动态代理,学过AOP的应该都不会陌生,因为代理是实现AOP功能的核心和关键技术.那么今天我们将开始动态代理的学习: 一.引出动态代理 生活中代理应该是很常见的,比如你可以通过代理商去买电脑,也可以 ...

  8. 学习Spring必学的Java基础知识(2)----动态代理

    Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...

  9. Java 反射之JDK动态代理

    Proxy提供用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类.如果我们在程序中为一个或多个接口动态地生成实现类,就可以使用Proxy来创建动态代理类:如果需要为一个或多个接口动态的 ...

随机推荐

  1. java左移右移运算符

    http://blog.csdn.net/dandanteng/article/details/7433531 首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数 ...

  2. T4 assembly

    In a T4 template the executing assembly is not yours but one from the T4 engine. To access types fro ...

  3. H264的句法和语法总结(一)分层结构

    在H.264 中,句法元素共被组织成  序列.图像.片.宏块.子宏块五个层次.在这样的结构中,每一层的头部和它的数据部分形成管理与被管理的强依赖关系,头部的句法元素是该层数据的核心,而一旦头部丢失,数 ...

  4. Win2008远程多用户登陆的配置方法 另附详细设置: Windows server 2008 R2实现多用户远程连接

    Win2008远程多用户登陆的配置方法     在使用Windows 2008远程登录功能时,如果需要进行多用户登录,可以采用以下配置方法: 首先要启用远程桌面这一功能:右击“我的电脑”→ 属性 → ...

  5. Drupal常用开发工具(一)——Devel模块

    进行 Drupal 开发时有许多模块和工具可供使用,其中最常用的两项便是 Devel 及 Drupal for Firebug.本文和<Drupal常用开发工具(二)——Drupal for F ...

  6. extjs grid 分页

    在使用extjs创建带分页功能的 grid 如下: 1.创建一个模型 // 创建算定义模型 模型名称 User Ext.define('User', { extend: 'Ext.data.Model ...

  7. centos下的防火墙配置

    1,查看防火墙文件: vim /etc/sysconfig/iptables # Generated by iptables-save v1. :: *filter :INPUT ACCEPT [:] ...

  8. C#实现文件下载的几种方法

    //WriteFile实现下载 protected void Button2_Click(object sender, EventArgs e) { /* using System.IO; */ st ...

  9. oracle表中某个字段含有字符回车、空格的手动修改方式

    select t.*, t.rowid from TB_SD_STANDARD_CHOOSE_ADVISE t where t.id =323900000 update TB_SD_STANDARD_ ...

  10. java基础回顾(四)——锁机制

    关键字Synchronized 1.对于同步的方法或者代码块来说,必须获得对象锁才能够进入同步方法或者代码块进行操作: 2.如果采用method级别的同步,则对象锁即为method所在的实例对象,如果 ...