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

准备如下

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. led驅動芯片對LED燈具的要求

    1.LED驅動芯片直流額定輸入電壓范圍應當8 - 40 v,覆蓋廣泛的應用需求.最好的壓縮能力大于45 v.當輸入交流12 v.24 v,簡單的橋式整流器輸出電壓可以遵循電網電壓波動,特別是在高電壓輸 ...

  2. C51 库函数(2)

    3.2 STDIO.H:一般I/O函数 C51编译器包含字符I/O函数,它们通过处理器的串行接口操作,为支持其它I/O机制,只需修改getkey()和putchar()函数,其它所有I/O支持函数依赖 ...

  3. HDOJ 1163 Eddy's digital Roots 九余数定理+简单数论

    我在网上看了一些大牛的题解,有些知识点不是太清楚, 因此再次整理了一下. 转载链接: http://blog.csdn.net/iamskying/article/details/4738838 ht ...

  4. C# 中dataTable中的数据批量增加至数据表中

    /// <summary> /// 批量添加 /// </summary> /// <param name="dt"></param> ...

  5. 慕课网《Android智能机器人“小慕”的实现》项目上手操作与代码解读【2】

    前几天有点忙,一直没写第三方API是怎么调用的,今天我先介绍一下如何调用图灵机器人第三方API. 一.图灵机器人API的调用 首先登录图灵机器人官网首页http://www.tuling123.com ...

  6. linux下服务器管理

    0.更新国内yum源,参考:http://blog.csdn.net/zhaoyue007101/article/details/8456188 1.创建用户.用户组: 新增用户组 groupadd ...

  7. oracle连接进程数设置

    SQL> select count(*) from v$session #连接数SQL> Select count(*) from v$session where status='ACTI ...

  8. Robot Framework学习资料

    robot user guide:http://robotframework.org/robotframework/#user-guide robot selenium 详细介绍:http://pan ...

  9. adb shell am pm 用法

    Using activity manager (am) Within an adb shell, you can issue commands with the activity manager (a ...

  10. CloudFoundry云环境中应用的特殊设计

    常规的应用,大多数可以不经过任何修改即可部署于CloudFoundry云平台之上,但是在一些特殊情况下,总是不可避免地会出现一些细小的问题,如果在应用设计之初,就考虑到针对云平台的一些特殊情况,遵守云 ...