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