一文了解Java动态代理的原理及实现


Posted in Java/Android onJuly 07, 2022

代理是指:某些场景下对象会找一个代理对象,来辅助自己完成一些工作,如明星的经纪人、买房的人找房产中介等。

代理主要是对对象的行为额外做一些辅助操作。 

如何创建代理对象:

Java中代理的代表类是:Java.lang.reflect.Proxy

Proxy提供了一个静态方法,用于为对象产生一个代理对象返回

主类:

public class Test {
    public static void main(String[] args) {
        //1、创建一个类,对象类必须实现接口
        star s=new star("小明");
        //为小明这个明星对象生成一个代理对象(经纪人)
        skill s2=StarAgentProxy.getProxy(s);
        s2.sing();//走代理的
        s2.jump();
        
        //运行结果:
        //代理开始
        //小明开始唱歌
        //代理结束
        //代理开始
        //小明开始跳舞
        //代理结束
    }
}

明星类(对象类):

//明星类
public class star implements skill{
    private String name;
 
    public star(String name) {
        this.name = name;
    }
    //重写方法
    public void jump(){
        System.out.println(name+"开始跳舞");
    }
    public void sing(){
        System.out.println(name+"开始唱歌");
    }
}

行为接口类:

//行为类
public interface skill {
    void jump();//跳舞
    void sing();//唱歌
}

代理类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
//代理类
public class StarAgentProxy {
    //定义一个方法来返回一个明星对象的代理对象
    public static skill getProxy(star obj){
        //为小明这个对象生成一个代理对象
        /*
          public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces, 对象实现的接口列表
                                          InvocationHandler h)
         */
        return (skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("代理开始");
                        //真正的让小明去唱歌、跳舞
                        //method==>正在调用的方法对象, args==>代表这个方法的参数
                        Object rs=method.invoke(obj,args);
                        System.out.println("代理结束");
                        return rs;
                    }
                });
    }
}

实现步骤:

1、必须存在接口

2、被代理的对象需要实现接口

3、使用Proxy类提供的方法得到对象的代理对象

一文了解Java动态代理的原理及实现

通过代理对象调用方法,执行流程是什么样的?

1、先走向代理

2、代理可以为方法额外做一些辅助工作

3、开始真正触发对象的方法的执行

4、回到代理中,由代理负责返回结果给方法的调用者

优化代码的关键步骤:

1、必须有接口,实现类要实现接口(代理通常是基于接口实现的)

2、创建一个实现类的对象,该对象为业务对象,紧接着为业务对象做一个代理对象 

动态代理的优点:

1、可以在不改变方法源码的情况下,实现对方法功能的增强,提高了代码的复用

2、简化了编程工作、提高了开发效率,同时提高了软件系统的可拓展性

3、可以为被代理对象的所有方法做代理

4、非常灵活,支持任意接口类型的实现类对象做代理,也可以直接为接口本身做代理

为任意接口类型的实现类对象做代理的框架(运行泛型)

public static <T> T get(T obj){
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return null;
                    }
                });
    }

到此这篇关于一文了解Java动态代理的原理及实现的文章就介绍到这了,更多相关Java动态代理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Java/Android 相关文章推荐
Java实现多线程聊天室
Jun 26 Java/Android
spring项目中切面及AOP的使用方法
Jun 26 Java/Android
Java中使用Filter过滤器的方法
Jun 28 Java/Android
Spring实现内置监听器
Jul 09 Java/Android
springboot中的pom文件 project报错问题
Jan 18 Java/Android
Java 数据结构七大排序使用分析
Apr 02 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
Apr 08 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
java实现自定义时钟并实现走时功能
Jun 21 Java/Android
java获取一个文本文件的编码(格式)信息
Sep 23 Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 #Java/Android
Spring中bean集合注入的方法详解
java中如何截取字符串最后一位
Jul 07 #Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 #Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 #Java/Android
利用Java连接Hadoop进行编程
Jun 28 #Java/Android
SpringBoot项目部署到阿里云服务器的实现步骤
Jun 28 #Java/Android
You might like
php excel类 phpExcel使用方法介绍
2010/08/21 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
jquery动态添加删除div 具体实现
2013/07/20 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
2018/09/12 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
python中assert用法实例分析
2015/04/30 Python
Python运算符重载用法实例分析
2015/06/01 Python
深入浅析Python字符编码
2015/11/12 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
Pythonic版二分查找实现过程原理解析
2020/08/11 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
一组SQL面试题
2016/02/15 面试题
团委书记的竞聘演讲稿
2014/04/24 职场文书
需求分析说明书
2014/05/09 职场文书
清明节寄语2015
2015/03/23 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
中小企业员工手册范本
2015/05/14 职场文书
趣味运动会标语口号
2015/12/26 职场文书
2019消防宣传标语!
2019/07/10 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python