Java 动态代理

来源:互联网 发布:mysql如何设置外键 编辑:程序博客网 时间:2024/05/25 19:55

1、TestService服务类接口定义:

package com.busy;public interface TestService {public void serviceA();public void serviceB();}


2、TestServiceImpl服务类接口实现:

package com.busy;public class TestServiceImpl implements TestService {@Overridepublic void serviceA() {System.out.println("打印Service (A)..");}@Overridepublic void serviceB() {System.out.println("打印Service (B)..");}}


3、TestServiceProxyServiceA动态代理类:

package com.busy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class TestServiceProxyServiceA implements InvocationHandler {private Object target;public Object bind(Object target) {          this.target = target;          // 取得代理对象          return Proxy.newProxyInstance(target.getClass().getClassLoader(),                  target.getClass().getInterfaces(), this);      }@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object result = null;          System.out.println("ProxyService (A) start...");          System.out.println("method name : "+method.getName());          result = method.invoke(target, args);          System.out.println("ProxyService (A) end...");          return result;}}


4、TestMain测试类:

package com.busy;public class TestMain {public static void main(String[] args) {TestServiceProxyServiceA proxy = new TestServiceProxyServiceA();  TestService bookProxy = (TestService) proxy.bind(new TestServiceImpl());      bookProxy.serviceA();      bookProxy.serviceB();}}


JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理



5、TestServiceProxyServiceB动态代理cglib实现:

package com.busy;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 TestServiceProxyServiceB implements MethodInterceptor {private Object target;        /**      * 创建代理对象      *       * @param target      * @return      */      public Object getInstance(Object target) {          this.target = target;          Enhancer enhancer = new Enhancer();          enhancer.setSuperclass(this.target.getClass());          // 回调方法          enhancer.setCallback(this);          // 创建代理对象          return enhancer.create();      } @Overridepublic Object intercept(Object arg0, Method arg1, Object[] arg2,MethodProxy arg3) throws Throwable {System.out.println("事物开始");  arg3.invokeSuper(arg0, arg2);          System.out.println("事物结束");  return null;}}


6、测试:

TestServiceProxyServiceB proxy = new TestServiceProxyServiceB();TestServiceB testProxy = (TestServiceB)proxy.getInstance(new TestServiceB());testProxy.ServiceA();