JDK动态代理的原理

来源:互联网 发布:sql server软件下载 编辑:程序博客网 时间:2024/06/11 22:32

   忽然发现JDK动态代理都忘记了,温习下。委屈

  JDK动态代理,只能对实现接口的类有效,具体在SPRING 中 AOP编程中,对 对象的某个方法实现前置增强,后置增强,环绕增强等
下面写一个类实现 java.lang.reflect.InvocationHandler,对一个实现接口的类,生成代理对象,来说明

先写一个接口

package cn.itcast.aop;public interface UserDao {public void add(String str);public void delete (String str);}

写一个类实现这个接口

package cn.itcast.aop.impl;import cn.itcast.aop.UserDao;public class UserDaoImpl implements UserDao {@Overridepublic void add(String str) {System.out.println("add==========="+str);}@Overridepublic void delete(String str) {System.out.println("delete======="+str);}}

最后,写一个类来生成这个实现类的代理对象

package cn.itcast.jdkProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import cn.itcast.aop.UserDao;public class UserDaoProxyFactory implements InvocationHandler{private UserDao userDao;

//既然是生成实现类的代理对象,就要将这个对象注入进去,那么在构造器中指定

public UserDaoProxyFactory(UserDao userDao){this.userDao = userDao;}

//这个就是生成了代理对象了

public UserDao createUserDao(){ //newProxyInstance(classLoader,interface,handler) //这个方法需要类加载器,实现类的接口,和一个handler,当然就是当前对象了Object newProxyInstance = Proxy.newProxyInstance(UserDaoProxyFactory.class.getClassLoader(), userDao.getClass().getInterfaces(), this);return (UserDao)newProxyInstance;}/** * invoke是代理对象,调用目标对象的任何方法都会执行的方法,可以在 * 这个方法内对想要操作的目标对象的方法前面,后面,进行一些添加,例如日志记录什么的 * 调用目标对象的任何方法都会调用invoke */@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {if(method.getName().equals("add")){System.out.println("before add==================");Object invoke = method.invoke(userDao, args);//调用的userDao的任何方法都会调用invokereturn invoke;}else if(method.getName().equals("delete")){Object invoke = method.invoke(userDao, args);System.out.println("after delete ===========");return invoke;}return method.invoke(userDao, args);}}

最后我们写个单元测试,测试一下

package cn.itcast.aop;import org.junit.Test;import cn.itcast.aop.impl.HelloServiceImpl;import cn.itcast.aop.impl.UserDaoImpl;import cn.itcast.jdkProxy.HelloServiceProxy;import cn.itcast.jdkProxy.UserDaoProxyFactory;public class AspectDemo {@Testpublic void test(){UserDao userdao = new UserDaoImpl();UserDaoProxyFactory factory = new UserDaoProxyFactory(userdao);//生成代理对象UserDao createUserDao = factory.createUserDao();createUserDao.add("hello");createUserDao.delete("hello");}}

结果如下:

before add==================add===========hellodelete=======helloafter delete ===========




    

0 0
原创粉丝点击