为了账号安全,请及时绑定邮箱和手机立即绑定

java反射之动态代理学习笔记

标签:
Java

动态代理概述:
代理:本来自己做的事情,请别人来做,被请的人就是代理对象;
举例:春节回家买票让人代理买
动态代理:在程序运行过程中产生的这个对象,而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以动态代理其实就是通过反射来生成一个代理。
在java 中java.lang.reflect包提供一个proxy类和一个invocationHandler接口,通过使用这个类和接口就可以生成动态代理对象,JDk提供代理只能针对接口做代理,我们有更强大的代理cglib、proxy类中的方法创建动态代理对象。
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)

测试方法一

/**     * @param args     */    public static void main(String[] args) {        /*UserImp ui = new UserImp();        ui.add();        ui.delete();        System.out.println("-------------------------------");*/        /*         * public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,         * InvocationHandler h)         */        /*MyInvocationHandler m = new MyInvocationHandler(ui);        User u = (User)Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(), m);        u.add();        u.delete();*/        StudentImp si = new StudentImp();        si.login();        si.submit();        System.out.println("-------------------------------");        MyInvocationHandler m = new MyInvocationHandler(si);        Student s = (Student)Proxy.newProxyInstance(si.getClass().getClassLoader(), si.getClass().getInterfaces(), m);        s.login();        s.submit();    }

方法二

public interface User {    public void add();    public void delete();}

方法三

public class UserImp implements User {    @Override    public void add() {        //System.out.println("权限校验");        System.out.println("添加功能");        //System.out.println("日志记录");    }    @Override    public void delete() {        //System.out.println("权限校验");        System.out.println("删除功能");        //System.out.println("日志记录");    }}

方法四

public class StudentImp implements Student {    @Override    public void login() {        System.out.println("登录");    }    @Override    public void submit() {        System.out.println("提交");    }}

方法五

public interface Student {    public void login();    public void submit();}

方法六

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler {    private Object target;    public MyInvocationHandler(Object target) {        this.target = target;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        System.out.println("权限校验");        method.invoke(target, args);                    //执行被代理target对象的方法        System.out.println("日志记录");        return null;    }}

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
39
获赞与收藏
243

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消