`

Java动态代理一——动态类Proxy的使用

    博客分类:
  • j2se
阅读更多

Java动态代理一——动态类Proxy的使用

1.什么是动态代理?

答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。代理一般会实现它所表示的实际对象的接口。代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道。
2.为什么使用动态代理?

答:因为动态代理可以对请求进行任何处理

3.使用它有哪些好处?

答:因为动态代理可以对请求进行任何处理
4.哪些地方需要动态代理?

答:不允许直接访问某些类;对访问要做特殊处理等

 

目前Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。 其实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。 

Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现

以下为模拟案例,通过动态代理实现在方法调用前后向控制台输出两句字符串

目录结构

<br/>

定义一个HelloWorld接口

复制代码
1 package com.ljq.test;
2
3  /**
4 * 定义一个HelloWorld接口
5 *
6 * @author jiqinlin
7 *
8 */
9  publicinterface HelloWorld {
10 publicvoid sayHelloWorld();
11 }
复制代码

<br/>

类HelloWorldImpl是HelloWorld接口的实现

复制代码
1 package com.ljq.test;
2
3  /**
4 * 类HelloWorldImpl是HelloWorld接口的实现
5 *
6 * @author jiqinlin
7 *
8 */
9  publicclass HelloWorldImpl implements HelloWorld{
10
11 publicvoid sayHelloWorld() {
12 System.out.println("HelloWorld!");
13 }
14
15 }
复制代码

HelloWorldHandler是 InvocationHandler接口实现

复制代码
1 package com.ljq.test;
2
3  import java.lang.reflect.InvocationHandler;
4  import java.lang.reflect.Method;
5
6  /**
7 * 实现在方法调用前后向控制台输出两句字符串
8 *
9 * @author jiqinlin
10 *
11 */
12  publicclass HelloWorldHandler implements InvocationHandler{
13 //要代理的原始对象
14  private Object obj;
15
16 public HelloWorldHandler(Object obj) {
17 super();
18 this.obj = obj;
19 }
20
21 /**
22 * 在代理实例上处理方法调用并返回结果
23 *
24 * @param proxy 代理类
25 * @param method 被代理的方法
26 * @param args 该方法的参数数组
27 */
28 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
29 Object result =null;
30 //调用之前
31   doBefore();
32 //调用原始对象的方法
33 result=method.invoke(obj, args);
34 //调用之后
35 doAfter();
36 return result;
37 }
38
39 privatevoid doBefore(){
40 System.out.println("before method invoke");
41 }
42
43 privatevoid doAfter(){
44 System.out.println("after method invoke");
45 }
46
47 }
复制代码

测试类

复制代码
package com.ljq.test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;


publicclass HelloWorldTest {

publicstaticvoid main(String[] args) {
HelloWorld helloWorld
=new HelloWorldImpl();
InvocationHandler handler
=new HelloWorldHandler(helloWorld);

//创建动态代理对象
HelloWorld proxy=(HelloWorld)Proxy.newProxyInstance(
helloWorld.getClass().getClassLoader(),
helloWorld.getClass().getInterfaces(),
handler);
proxy.sayHelloWorld();
}
}
复制代码

运行结果为:

分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java 常用设计模式(2)

    —————————— 代理模式(Proxy) ——————————-  (1)代理的好处:  —&gt;是可以在间接访问对象的同时,要其前或后,添加其它的逻辑代码.  —&gt;对原来逻辑进行添加其它逻辑,终生成新的逻辑.即:对...

    design-pattern-java.pdf

    实现对象的复用——享元模式(二) 实现对象的复用——享元模式(三) 实现对象的复用——享元模式(四) 实现对象的复用——享元模式(五) 代理模式-Proxy Pattern 设计模式之代理模式(一) 设计模式之代理模式...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷1

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷9

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷3

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/...

    java8stream源码-coala-binder:代理的通用本体抽象层——一种上下文绑定器,用于跨AOSE/MAS和M&S/ABM重用异构

    代理的通用本体抽象层——一种上下文绑定器,用于跨 AOSE/MAS 和 M&S/ABM 重用异构代理代码 常见的 具有异步回调的函数式风格:和 v1.1,添加实用程序,包括Instantiator 、 Caller 、 Thrower 、 TypeArguments等。...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷10

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷5

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷2

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷7

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷4

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/...

    Ext Js权威指南(.zip.001

    7.2.5 使用ajax处理数据的代理:ext.data.proxy.ajax与ext.data.proxy.rest / 308 7.2.6 跨域处理数据的代理:ext.data.proxy.jsonp / 312 7.2.7 为ext.direct服务的代理:ext.data.proxy.direct / 312 7.2.8 ...

    asp.net知识库

    使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    开涛高可用高并发-亿级流量核心技术

    2 负载均衡与反向代理 18 2.1 upstream配置 20 2.2 负载均衡算法 21 2.3 失败重试 23 2.4 健康检查 24 2.4.1 TCP心跳检查 24 2.4.2 HTTP心跳检查 25 2.5 其他配置 25 2.5.1 域名上游服务器 25 2.5.2 备份上游服务器 ...

Global site tag (gtag.js) - Google Analytics