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
- JDK的动态代理原理
- JDK动态代理的原理
- jdk动态代理原理
- JDK动态代理原理
- JDK动态代理原理
- jdk动态代理原理
- JDK动态代理原理
- jdk动态代理模式的原理解析
- 细说JDK动态代理的实现原理
- JDK的动态代理实现原理理解
- 细说JDK动态代理的实现原理
- 细说JDK动态代理的实现原理
- JDK动态代理的实现及原理
- 细说JDK动态代理的实现原理
- 细说JDK动态代理的实现原理
- 细说JDK动态代理的实现原理
- JDK动态代理的实现及原理
- JDK动态代理的实现及原理
- Linux命令行下载文件
- UML用例图总结
- Java输入带空格的数字字符串,输出数字的和(找规律停止程序)
- mysqlの索引原理
- 【Spring学习34】Spring事务(4):事务属性之7种传播行为
- JDK动态代理的原理
- bzoj1803: Spoj1487 Query on a tree III
- 绿色软件wvyb
- 【c/c++】如何调用【linux】shell命令行命令并获取命令行的输出内容
- 时间日期格式转换
- 容器类的同步
- 创新者并不一定是科学家
- 指针与二维指针、引用
- bzoj3916: [Baltic2014]friends