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

准备如下

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. 转:使用XHProf优化PHP程序

    原文来自于:http://blog.sina.com.cn/s/blog_665fc8980100l8dq.html XHProf 是 FaceBook 开发的一个函数级别的 PHP 分层分析器. 数 ...

  2. 【手机安全卫士01】项目Splash页面的开发与设计

    首先建立一个安卓的项目,然后修改manifest.xml文件,修改应用程序的logo和显示名称,效果图如下: 对应的代码如下: <?xml version="1.0" enc ...

  3. poj 1364

    http://poj.org/problem?id=1364 #include<cstdio> #include<cstring> #include<algorithm& ...

  4. JAVA简单的SWING及AWT

    慢慢找感觉~~ package SwingGui.sky.com; import javax.swing.*; import java.awt.*; import java.awt.event.*; ...

  5. 14.4.4 Redo Log Buffer

    14.4.4 Redo Log Buffer redo log buffer 是内存区域持有数据被写入到redo log. Redo log buffer size 是通过 innodb_log_bu ...

  6. Delphi TNativeXML Node节点乱码的一种解决方法

    Node1.WriteString(HomologousFieldItem.cXMLNodeCode, AnsiToUtf8(FieldByName(HomologousFieldItem.cMapp ...

  7. 10个提升iOS开发效率的必用工具

    Xcode插件 几乎所有开发者都知道Alcatraz是一个开源的包管理工具,可以让我们更轻松地管理各种插件.接下来就介绍下我的最推荐的10个插件: 10.HOStringSense 在编辑字符串的时候 ...

  8. config large memory

    C Configuring Large Memory Optimization This appendix provides information for configuring memory op ...

  9. 2015 GOOGLE I/O大会看点总结:新的开发工具及云端测试工具

        http://ask.android-studio.org/?/article/48 尽管凌晨开始的主题演讲略显晦涩并继承了谷歌一贯的东一句西一句想起啥说啥的混乱风格,但期待用技术改变世界的技 ...

  10. [OpenNebula]中间件訪问驱动程序

    /* -------------------------------------------------------------------------- */ /* Copyright 2002-2 ...