动态代理之JDK

来源:互联网 发布:python字典转化 编辑:程序博客网 时间:2024/05/16 02:01
代理技术有俩种实现方式::
* JDK的动态代理        :针对实现了接口的类产生代理.
* Cglib的动态代理      :针对没有实现接口的类产生代理.产生了这个类的一个子类对象.不要使用final修改这个类.
这篇文章说一下JDK方式的动态代理,用到了装饰者模式。
直接上例子:
一个接口:
public interface PersonDao {void add();void delete();void modify();void find();}
一个实现类
public class PersonDaoImpl implements PersonDao {@Overridepublic void add() {System.out.println("执行了增加方法。。。");}@Overridepublic void delete() {System.out.println("执行了删除方法。。。");}@Overridepublic void modify() {System.out.println("执行了修改方法。。。");}@Overridepublic void find() {System.out.println("执行了查询方法。。。");}}
一个JDK动态代理类
public class PersonJDKProxy implements InvocationHandler {private PersonDao personDao;public PersonJDKProxy(PersonDao personDao){this.personDao = personDao;}/** * 创建PersonDao的代理 */public PersonDao createProxy(){PersonDao newProxyInstance = (PersonDao)Proxy.newProxyInstance(personDao.getClass().getClassLoader(), personDao.getClass().getInterfaces(), this);return newProxyInstance;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//判断方法if("modify".equals(method.getName())){System.out.println("使用JDK代理的方式增强了修改方法");return method.invoke(personDao, args);}return method.invoke(personDao, args);}}
一个测试类
@Testpublic void demo1(){PersonDao personDao = new PersonDaoImpl();PersonDao proxy = new PersonJDKProxy(personDao).createProxy();proxy.add();proxy.delete();proxy.modify();proxy.find();}
出结果:有图有真相:


阅读全文
0 0
原创粉丝点击