Java 动态代理
来源:互联网 发布:5g网络概念股龙头 编辑:程序博客网 时间:2024/03/28 22:24
动态代理是在程序动态执行时去生成的class,在生成时要提供一组interface给它,然后该class就宣称实现了这些接口,生成的代理对象不会做实质性的工作,比如增加其他业务逻辑等,在生成实例时必须提供一个handler,由它来接管工作,是加上应用的就是反射技术。
代码:
生命被代理对象所实现的接口
public interface SubjectInf {String Say(String name);}
被代理对象的具体实现:
public class SubjectImpl implements SubjectInf {@Overridepublic String Say(String name) {// TODO Auto-generated method stubreturn "hello"+name;}}
实现一个handler
public class SubjectDyanmic implements InvocationHandler {private SubjectImpl subject;public SubjectDyanmic(SubjectImpl subject) {super();this.subject = subject;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("invoke run..." );if (args == null) {method.invoke(subject, args);return null;} else{ String res = (String) method.invoke(subject, args); return res;}}}
public class Client {public static void main(String[] args) {SubjectImpl sub =new SubjectImpl();InvocationHandler handler = new SubjectDyanmic(sub); System.out.println("进入前");//生成代理对象SubjectInf subinf = (SubjectInf)Proxy.newProxyInstance(sub.getClass().getClassLoader() ,sub.getClass().getInterfaces(), handler); System.out.println("代理生成完毕");/*** * 当要执行被代理对象的某个方法时会立即执行handler里面的invoke方法(反射), * 不执行被代理对象的某个方法时不会执行handler的方法 */ String res=subinf.Say("Li"); System.out.println(res);}}
</pre><pre>
程序输出:
进入前代理生成完毕invoke run...helloLi
如果我们测试Clinent不调用被代理对象的某个方法时 输出:
进入前代理生成完毕helloLi
可见动态代理实质是分为两大块,一个是生成代理对象,再者是根据java反射去执行被代理对象的一些方法,即调用invoke方法。
0 0
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- 统计1~100出现多少次9
- 【IOS 开发】之定位及反编码 —— 伊禾媛
- 机器学习界大牛林达华推荐的书籍
- get和post的区别
- myeclipse 修改配色方案后,jsp视图对JavaScript段总是显示为白色背景,解决方法
- Java 动态代理
- 网站推广是系统工程 转载
- socket套接口的 值-结果参数
- Core Java Interview Questions and Answers
- 打造博客的品牌效应
- 将大写字母转化成小写字母
- No package 'glibmm-2.4' found ( When install Mango)
- 第三方开始大力开发艰苦拉萨地方阿斯蒂芬阿萨德
- 解决C++中宏定义导致的名字污染