动态代理_JDK自带的动态代理实现

动态代理是指在运行时,动态生成代理。即,代理类的字节码将在运行时生成并载入当前的ClassLoader。与静态代理相比,动态代理有很多好处。首先,不需要为真实的主题写一个形式上完全一样的封装类,假如主题接口中的方法很多,为每一个接口写一个代理方法也是非常烦人的事情,如果接口有变动,则真实主题和代理都需要修改,不利于系统的维护;其次,使用一些动态代理的生成方法甚至可以在运行时指定代理类的执行逻辑,从而大大提升系统的灵活性。

  注意:动态代理使用字节码动态生成加载技术,在运行时生成并加载类。

代理模式示例代码:

 1 //第一个主题
 2 public interface IDBQuery {
 3
 4     public void query();
 5 }
 6
 7 public class DBQuery implements IDBQuery {
 8
 9     @Override
10     public void query() {
11         System.out.println("request...");
12     }
13
14 }
15
16 public class ProxyHandler implements InvocationHandler {
17
18     private Object proxied;
19
20     public ProxyHandler(Object proxied){
21         this.proxied = proxied;
22     }
23
24     @Override
25     public Object invoke(Object proxy, Method method, Object[] args)
26             throws Throwable {
27         //在调用具体目标对象之前,可以执行一些处理
28
29         //转调具体目标对象的方法
30         return method.invoke(proxied, args);
31         //在转调具体目标对象之后,可以执行一些功能处理
32     }
33
34 }
35
36 //第二个主题
37 public interface Subject {
38
39     public void dosomething();
40 }
41
42 public class RealSubject implements Subject {
43
44     @Override
45     public void dosomething() {
46         System.out.println("call dosomething!!!");
47     }
48
49 }
50
51 //调用
52 public class DynamicProxy {
53
54     public static void main(String[] args) {
55         RealSubject real = new RealSubject();
56         Subject proxySubject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(),
57                 new Class[]{Subject.class},
58                 new ProxyHandler(real));
59         proxySubject.dosomething();
60
61         DBQuery dbQuery = new DBQuery();
62         IDBQuery proxyIdbQuery =(IDBQuery) Proxy.newProxyInstance(IDBQuery.class.getClassLoader(),
63                 new Class[]{IDBQuery.class},
64                 new ProxyHandler(dbQuery));
65         proxyIdbQuery.query();
66     }
67
68 }

输出结果:

1 call dosomething!!!
2 request...

拓展,可参考这位仁兄的博客

http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html

时间: 2024-10-10 23:42:46

动态代理_JDK自带的动态代理实现的相关文章

jdk自带的动态代理

package com.stone.dp.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * jdk自带的动态代理:必须实现了某个接口:<br> */ public class JdkProxy implements InvocationHandler { private Object obj; publ

代理模式-利用JDK原生动态实现AOP

一.目录 二.概述与模型 1.概述 含义:控制对对象的访问. 作用:详细控制某个(某类)某对象的方法,在调用之前做前置处理,调用之后做后置处理,从而实现将统一流程代码放在代理类中处理. 举例:我们在学习JDBC的时候,在批量处理的时候遇到过事务.流程:设置提交方式为手动提交-开启事务-批量处理-关闭事务-设置提交方式为默认.从这里我们清晰可以看见,每次进行批处理的时候,唯有增删改操作变化,其他的操作都是一样的.那么,我们可不可以把一样的操作提取出来交给一个类处理,批量操作提取出来交给一个类实现?

java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。

1.java自带的proxy类可以创建动态类,如果一个类实现了一个接口那么久可以为这个类创建代理. 2.代理:就是当用户要调用一个类的方法时,用户可以通过调用代理,代理通过接口调用原来的类的方法,代理在把方法给用户前可以添加一些方法,如错误日志,用户类的方法运行的时间来监听类方法的性能.当代理完成时候就是当代理调用方法时候,就会启动InvocationHandler里的invoke方法.用户并不知道用户要为哪个类带理,因此在框架中用配置文件来获取代理的类,用户需要用框架时候就修改配置文件即可.

设计模式之动态代理(Java的JDK动态代理实现)

对于JDK的动态代理,孔浩老师说学习的方法是把它记下来. 先写一个主题接口类,表示要完成的一个主题. package com.liwei.dynaproxy; /** * 要代理的主题接口 * @author Administrator * */ public interface Subject { public void miai(); } 再写一个实现类,这个实现类实现这个接口.当然,这个实现类就是我们要代理的对象. 为了区别不同的类的对象,我们为Person类增加了一个name属性,并且通

代理模式(静态、动态)

代理模式的使用价值还是挺高的,各种框架中都用到了.把基础认真看看,学框架的时候也容易了. 关于静态代理: 代理模式的应用场景: 如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法: 1.修改原有的方法来适应.这样违反了“对扩展开放,对修改关闭”的原则. 2.就是采用一个代理类调用原有的方法,且对产生的结果进行控制.这种方法就是代理模式. 使用代理模式,可以将功能划分的更加清晰,有助于后期维护! 代理模式的要点: 1.“增加一层间接层”是软件系统中对许多负责问题的一种常见解决方法.

动态代理:1 个经纪人如何代理 N 个明星

在代理模式:女朋友这么漂亮,你缺经纪人吗? 中我们用宝强的例子介绍了静态代理模式的概念. 本来我的目的是通过大家耳熟能详的例子来加深理解,但是有些网友指责我"没底线"."幸灾乐祸",其实我比你们谁都爱宝强!他的每个电影我都看,电影里他受苦了我都心疼,比如说看到<盲井>里弱小的他被失足女欺负,我只想说:放开宝强,换我来! OK,这篇文章我们将结合其他例子介绍动态代理模式.: ) 回顾静态代理 为了加深理解我们回顾一下静态代理,定义一个规定行为的明星电影接口

国内最大的动态IP代理服务商,百万级动态IP无限换是哪家最好?

兔子动态IP-国内最大的动态IP代理服务商,百万级动态IP无限换. 兔子IP ,动态IP行业领导者.兔子IP是个专业的全局IP代理服务平台,内含上千的专业级动态ip方案,且支持一键轻松换IP,提供专业.高质量且稳定的代理服务. 软件名称:兔子动态IP软件版本:V1.0.1软件大小:1.46MB 软件语言:简体中文/繁体中文/英文 软件类型:国产软件 运行环境:Winxp/vista/win7/win8/win10/苹果/安卓插件情况:无插件 软件介绍:兔子动态IP是国内IP代理软件中一款强大的游

动态ip软件基本知识和动态ip代理使用方法扫盲

一.什么叫动态ip代理电脑软件? 动态ip代理电脑软件是介于电脑浏览器和web集群服务器的一台网络服务器,如果你利用动态ip代理电脑软件上外网访问时,电脑浏览器并不是立即到web网络服务器去取回来网页页面,只是向动态ip代理电脑软件发出请求,由动态ip代理电脑软件来取回来电脑浏览器所须要的信息内容,并传输给你的电脑浏览器. 二.什么叫完全免费动态ip代理电脑软件 ? 在应用芝麻代理等软件搜索动态ip代理手机软件详细地址时,会在认证通知栏中经常出现类似于"要登陆密码"."Fre

性能优于JDK代理,CGLib如何实现动态代理

按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行时,运用反射机制动态创建而成. 动态代理三种方式 动态代理实现有三种方式,jdk动态代理(基于接口),cglib动态代理(基于继承),javassist(hibernate中使用这种方式)实现动态代理. JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢? 这就需要CGLib了. cgl