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

准备如下

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. bzoj2067: [Poi2004]SZN

    Description String-Toys joint-stock 公司需要你帮他们解决一个问题. 他们想制造一个没有环的连通图模型. 每个图都是由一些顶点和特定数量的边构成. 每个顶点都可以连向 ...

  2. kibo.js 处理键盘事件的Javascript工具库

    这个也是做在线编辑用到的 选中文字快捷键.提高编辑效率 https://github.com/marquete/kibo 用法很简单 Examples var k = new Kibo(); Sing ...

  3. Cracking the coding interview--Q2.2

    Implement an algorithm to find the kth to last element of a singly linked list. 实现一个算法寻找链表中倒数第K个数.. ...

  4. IC芯片設計

    IC從生產目的上可以分成為通用IC(如CPU,DRAM,接口芯片等)和ASIC(ApplicationSpecificIntegreted Circuit)兩種,ASIC是因應專門用途而生產的IC.  ...

  5. 【经典】Linux开发人员必看资料+工具

    Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核.Linux可安装在各种计算机硬件设备中,比如手机.平板电脑.路由器.视频游戏控制台.台 ...

  6. 【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)

    题目链接: https://vijos.org/p/1114 题目大意: 把01串一分为二,左半边描述当前节点左子树,右半边描述右子树,子树全为1则为I节点,全为0则为B节点,混合则为F节点,直到当前 ...

  7. 如何编写一个JSON解析器

    编写一个JSON解析器实际上就是一个函数,它的输入是一个表示JSON的字符串,输出是结构化的对应到语言本身的数据结构. 和XML相比,JSON本身结构非常简单,并且仅有几种数据类型,以Java为例,对 ...

  8. Java多线程编程(一)

    1.Java创建多线程的方法一:(1)实现Runnable接口并实现其中的run()方法:(2)将Runable对象提交给一个Thread构造器,调用start()方法. [程序实例]单线程 publ ...

  9. JavaScript 阻止默认时间和冒泡时间

    <!DOCTYPE HTML><html> <head> <title>event cancel</title> </head> ...

  10. Android BaseAdapter ListView (明星简介列表)

    1.搭建布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" andro ...