JDK的动态代理

来源:互联网 发布:cf淘宝商城 编辑:程序博客网 时间:2024/06/09 11:01

JDK动态代理:对实现了接口的类生成代理


首先有一个接口UserDao

package com.shyleo.demo1;public  interface UserDao {public void add();public void delete();}

实现类UserDaoImpl

package com.shyleo.demo1;public class UserDaoImpl implements UserDao{@Overridepublic void add() {System.out.println("添加用户..");}@Overridepublic void delete() {System.out.println("删除用户..");}}


JDKProxy动态代理类

package com.shyleo.demo1;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class JDKProxy implements InvocationHandler{public JDKProxy(){}getprivate Object target;public JDKProxy(Object target){this.target=target;}public UserDao createProxy(){System.out.println("createProxy方法..");UserDao proxy=(UserDao) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);return proxy;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("invoke方法....");if("add".equals(method.getName())){System.out.println("===添加日志===");  //增强的代码//Object result=method.invoke(userDao, args); //result是方法的返回值,在这里method.invoke(userDao, args);就是调用add方法,result就是add方法的返回值Object result=method.invoke(target, args); //result是方法的返回值,在这里method.invoke(userDao, args);就是调用add方法,result就是add方法的返回值return result;}//return method.invoke(userDao, args);return method.invoke(target, args);}}


测试代码:

@Testpublic void test2(){// 被代理对象UserDao userDao=new UserDaoImpl();// 创建代理对象的时候传入被代理对象.UserDao proxy=new JDKProxy(userDao).createProxy();proxy.add();proxy.delete();}



1 0
原创粉丝点击