java动态代理
来源:互联网 发布:swift 自定义元素数组 编辑:程序博客网 时间:2024/05/20 19:30
1.什么是java代理
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
2.java动态代理有什么用
java动态代理通俗的讲就是对你原先已有的类进行改造,在他类中方法的前面或后面添加其他方法。
3.目前java开发包中支持动态代理的实现,JDK动态代理主要运用到了反射。
实例如下:
1)先实现一个helloworld的接口
package com.example.ProxyTest;public interface HelloWorld {public void sayHelloWorld(String name);}
2)在写一个类实现这个接口
package com.example.ProxyTest;public class HelloWorldImpl implements HelloWorld{@Overridepublic void sayHelloWorld(String name) {System.out.println(name+"hello world");}}
3)在实现InvocationHandler这个接口
package com.example.ProxyTest;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class HelloWorldHandle implements InvocationHandler{private Object obj;public HelloWorldHandle(Object obj) {super();this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = null;doBefor();result = method.invoke(obj, args);doAfter();return result;}public void doBefor(){System.out.println("do before method");}public void doAfter(){System.out.println("do after method");}}
4)最后测试
package com.example.ProxyTest;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;public class HelloWorldTest {public static void main(String[] args) {HelloWorld helloWorld = new HelloWorldImpl();InvocationHandler handler = new HelloWorldHandle(helloWorld);HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(helloWorld.getClass().getClassLoader(),helloWorld.getClass().getInterfaces(), handler);proxy.sayHelloWorld("张三");}}
1.要用java自带的包实现动态代理必须要实现一个或者多个接口
2.代理类必须要实现InvocationHandler这个接口
3.为什么要在代理类中定义一个object对象并在构造函数中初始化他?
因为要把被代理的对象(HelloWorld)传入代理类中,并在invoke方法中把被代理的对象(HelloWorld)传入这个方法。(现在有点混乱,没解释好,等我想好了再来改)
运行结果如下:
4.使用CGLIB实现动态代理
在使用CGLIB实现动态代理的时候我们要先导入他的开发包,可以百度下载。
CGLIB不需要像javaJDK动态代理一样必须要继承接口,没有继承也可以实现动态代理。
实例如下:
1)先写一个被代理类
<span style="font-size:18px;">package com.example.CglibTest;public class HelloWorld {public void sayHelloWorld(String name){System.out.println(name+"hello world");}}</span>
2)在写一个代理类
<span style="font-size:18px;">package com.example.CglibTest;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor{private Object obj = null;public Object createProxy(Object target){this.obj = target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.obj.getClass());enhancer.setCallback(this);enhancer.setClassLoader(target.getClass().getClassLoader());return enhancer.create();}@Overridepublic Object intercept(Object proxy, Method method, Object[] params, MethodProxy arg3) throws Throwable {Object result = null;doBefore();result = method.invoke(obj, params);doAfter();return result;}private void doAfter() {System.out.println("do after method");}private void doBefore() {System.out.println("do before method");}}</span>
3)测试
<span style="font-size:18px;">package com.example.CglibTest;public class CglibTest {public static void main(String[] args) {HelloWorld helloWorld = new HelloWorld();CglibProxy proxy = new CglibProxy();HelloWorld hw = (HelloWorld) proxy.createProxy(helloWorld);hw.sayHelloWorld("李四");}}</span>
CGLIB动态代理的代理类要实现MethodInterceptor这个接口。
大家注意看这两种方法的代理类的中有一个方法几乎是一模一样,这两种方法不同的是JDK动态代理在测试的时候动态绑定,而CGLIB在代理类中实现动态绑定。
运行结果如下:
0 0
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- IOS开发-14.利用代码添加autolayout约束
- x264中bs.h文件部分函数解读
- cocos2dx自学之路 精灵执行动作+TableView控件
- 4.第三单元任务三实训:编写一个类ExceptionTest,在main方法中使用try-catch-finally语句结构实现:在try语句块中,编写两个数相除操作,相除的两个操作数要求程序运行时用
- iOS中几种数据持久化方案
- java动态代理
- ohasd failed to start错误解决办法
- POJ 2387
- 2015年6月积累
- 12天学好C语言——记录我的C语言学习之路(Day 11)
- 什么叫编译时和运行时
- OC05_数组
- java.lang.IllegalStateException: Failure saving state: active HomeMainFg{42ed2fb8} has cleared index
- 5.编写一个java程序,该程序有两个类:Tank(用于刻画坦克)和Fight(主类)。 已知坦克类如下: