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

准备如下

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. Scut:通用配置管理器

    1. 配置节 ConfigSection private List<ConfigNode> _configNodes; public class ConfigNode { public C ...

  2. 转:微博CacheService架构浅析

    文章来自于:http://www.infoq.com/cn/articles/weibo-cacheservice-architecture 微博作为国内最大的社交媒体网站之一,每天承载着亿万用户的服 ...

  3. es watcher

    https://www.elastic.co/products/watcher https://www.elastic.co/blog/watcher-beta-goes-public-you-kno ...

  4. Android调用Asp.net Web Service示例

    WebService代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; u ...

  5. 云方案,依托H3C彩虹云存储架构,结合UIA统一认证系统,实现了用户数据的集中存储和管理

    客户的声音 资料云项目在迷你云基础上二次开发,通过使用云存储技术及文件秒传技术,对文件进行统一存储与管理,以达到节约文件管理成本.存储成本目的:通过有效的文件版本控制机制,以达到风险管控的目的:通过多 ...

  6. sql server 的ANSI_NULLS设置

    当 SET ANSI_NULLS 为 ON 时,表示SQL语句遵循SQL-92标准.当 SET ANSI_NULLS 为 OFF 时,表示不遵从 SQL-92 标准. SQL-92 标准要求对空值(N ...

  7. 64位操作系统 注册 capicom.dll

    把capicom.dll 放到c:\windows\syswow64目录   以管理员身份运行c:\windows\syswow64\cmd.exe   执行 regsvr32 capicom.dll ...

  8. C++編程札記「基礎」

    一直以為自己最擅長的編程語言是C++,那時自己的水平停留在使用C++來實現數據結構中的各種ADT和ACM算法. 創建一個類,必須實現的成員函數 explicit構造函數 對於單參數構造函數,添加exp ...

  9. 「Githug」Git 游戏通关流程

    Githug 他喵的这是个啥!?难道不是 GitHub 拼错了么,和 Git 什么关系? 和游戏又有什么关系? 其实,他的元身在这里:https://github.com/Gazler/githug  ...

  10. Sql 行转列、列转行及分页

    说明:本实例是以 SQL Server 2005 为运行环境的. 准备工作:创建一个名为 DB 的数据库(CREATE DATABASE DB). 一.T-SQL 行转列 1.创建如下表 CREATE ...