动态代理是对包装模式的升级,可以动态的传入需要代理的对象实现代理

准备如下

1. 被代理类的接口

2.被代理类

3.处理器:InvocationHandler

4.代理调用:Proxy.newInstance

 /**
* 这是被代理的类的第一个接口
* Created by yesiming on 16-11-21.
*/
public interface UserDao {
public void insert(String name);
public String getUser(String name);
}
 /**
* 这是被代理的类的第二个接口
* Created by yesiming on 16-11-21.
*/
public interface HumanDao {
public void insertId(int i);
}
 package o2.impl;

 import o2.HumanDao;
import o2.UserDao; /**
* 这是被代理的类
* Created by yesiming on 16-11-21.
*/
public class UserDaoImpl implements UserDao, HumanDao { public void insert(String name) {
System.out.println("插入User");
} public String getUser(String name) {
System.out.println("获取User");
return "得到" + name;
} public void insertId(int i) {
System.out.println("id是:" + i);
}
}
 package o2;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; /**
* 1.这是处理器,用来执行被代理类的方法
* 2.通过构造函数传入被代理类的对象
* 3.通过反射执行方法(method调用invoke)
* Created by yesiming on 16-11-21.
*/
public class MyInvocationHandler implements InvocationHandler { private Object object; public MyInvocationHandler(Object object) {
this.object = object;
} public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.print("开始执行...");
Object obj = method.invoke(object, args);
return obj;
}
}
 package o2;

 import o2.impl.UserDaoImpl;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; /**
* Created by yesiming on 16-11-21.
*/
public class ProxyDemo { public static void main(String[] args) throws Exception{
// 需要用到类加载器
ClassLoader loader = ClassLoader.getSystemClassLoader();
// 被代理类实现的接口列表
Class[] interfaces = {UserDao.class, HumanDao.class};
UserDao ud1 = new UserDaoImpl();
// 创建处理器
InvocationHandler handler = new MyInvocationHandler(ud1);
// 通过Proxy执行,需要参数:类加载器,接口列表,处理器
Object ret = Proxy.newProxyInstance(loader, interfaces, handler);
((UserDao)ret).insert("yesiming");
String str = ((UserDao)ret).getUser("yesiming");
System.out.println(str);
((HumanDao)ret).insertId(1);
}
}

执行结果如下:

开始执行...插入User
开始执行...获取User
得到yesiming
开始执行...id是:1

Java反射 - 3(动态代理)的更多相关文章

  1. Java反射和动态代理

    Java反射 反射机制 RTTI 编译器在编译时打开和检查*.class文件 反射机制 运行时打开和检查*.class文件 Java反射常见的方法 java反射的应用 setAccessible(bo ...

  2. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  3. Java反射机制动态代理

    1.什么事反射机制动态代理 在一段代码的前后动态执行其他操作,比如有一个方法是往数据库添加一个记录,我们可以通过动态代理,在操作数据库方法的前和后添加代码执行打开数据库连接和关闭数据库连接. 2.演示 ...

  4. java反射和动态代理实现与原理详细分析

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式, ...

  5. java反射实现动态代理

    参考:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html http://my.oschina.net/lyp3314/b ...

  6. Java反射与动态代理

    Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制.java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的 ...

  7. Java 反射之动态代理

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt205 利用Java反射机制你可以在运行期动态的创建接口的实现.java.la ...

  8. java反射与动态代理的理解

    一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象 ...

  9. java反射以及动态代理的学习

    java反射学习 1)字节码文件的三种获取方式 ①:Object类的getClass()方法:对象.getClass() ②:数据类型的静态的class属性:类名.class ③:通过Class类的静 ...

随机推荐

  1. JS和正则表达式验证手机号码、邮箱等

    <-------------------------------------验证手机号码---------------------------------------------> fun ...

  2. System.Web.Http.Tracing 在webapi里面应用

    最近想写log.再接口里面 所以就想到了.net 4.0提供的这个类. 整好.配合asp.net api好使用 ,而且 本地调试会在 vs Output 里面输出. 1.开启这个Tracing con ...

  3. 【Maven实战】依赖的聚合和版本管理

    1.在之前的文章中,我们已经建立了四个Maven项目,但是此时如果我们要对这四个项目进行编译打包时,必须一个一个的进行执行命令,而聚合就是指只要我们在其中一个项目中编写一些代码,则在进行此项目的编译和 ...

  4. Keil C51库函数原型列表

    //1. CTYPE.H bit isalnum(char c): bit isalpha(char c): bit iscntrl(char c): bit isdigit(char c): bit ...

  5. 一步一步学习SignalR进行实时通信_7_非代理

    原文:一步一步学习SignalR进行实时通信_7_非代理 一步一步学习SignalR进行实时通信\_7_非代理 SignalR 一步一步学习SignalR进行实时通信_7_非代理 前言 代理与非代理 ...

  6. SlidingMenu和ActionBarSherlock结合滑动式菜单都

    https://github.com/jfeinstein10/SlidingMenu http://actionbarsherlock.com/ SlidingMenu 的demo工程引用了Acti ...

  7. cursor pin S wait on X

    cursor pin S wait on X: 这是10.2版本提出的mutex(互斥)机制用来解决library cache bin latch争夺问题引入的新事件,是否使用这种机制受到隐含参数_k ...

  8. 【归并排序】【逆序数】HDU 5775 Bubble Sort

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 题目大意: 冒泡排序的规则如下,一开始给定1~n的一个排列,求每个数字在排序过程中出现的最远端 ...

  9. 解读sample3

    说明 理解被测试代码 理解测试代码:test fixture简介 编写fixture class TEST_F宏 其他 不应该被忽略的注释 说明 被测试代码文件 sample3-inl.h 测试代码文 ...

  10. Spreadsheet Calculator 电子表格计算器 (Uva 215)

    原题:https://uva.onlinejudge.org/external/2/215.pdf 有一个M x N的表格,每个单元格是个数字或者表达式.表达式由单元格编号和+ - 号组成 输出单元格 ...