一文了解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 15 Java/Android
如何解决springcloud feign 首次调用100%失败的问题
Jun 23 Java/Android
Java图书管理系统,课程设计必用(源码+文档)
Jun 30 Java/Android
Java中多线程下载图片并压缩能提高效率吗
Jul 01 Java/Android
Java 泛型详解(超详细的java泛型方法解析)
Jul 02 Java/Android
Android自定义ScrollView实现阻尼回弹
Apr 01 Java/Android
Android开发之底部导航栏的快速实现
Apr 28 Java/Android
MyBatis核心源码深度剖析SQL语句执行过程
May 20 Java/Android
Android开发手册Chip监听及ChipGroup监听
Jun 10 Java/Android
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
Jun 21 Java/Android
Android学习之BottomSheetDialog组件的使用
Jun 21 Java/Android
maven 解包依赖项中的文件的解决方法
Jul 15 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递归算法和应用方法介绍
2013/04/15 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
JS的数组的扩展实例代码
2008/07/09 Javascript
jquery trim() 功能源代码
2011/02/14 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
js实现一键复制功能
2017/03/16 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
React如何实现浏览器打印部分内容详析
2019/05/19 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
python 循环遍历字典元素的简单方法
2016/09/11 Python
Python编程之string相关操作实例详解
2017/07/22 Python
python更改已存在excel文件的方法
2018/05/03 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
python如何处理程序无法打开
2020/06/16 Python
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
西班牙香水和化妆品连锁店:Druni
2019/05/05 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
Weblogc domain问题
2014/01/27 面试题
八年级物理教学反思
2014/01/19 职场文书
企业业务员岗位职责
2014/03/14 职场文书
企业趣味活动方案
2014/08/21 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
担保书格式
2015/01/20 职场文书
共青团员自我评价
2015/03/10 职场文书
2016春节慰问信范文
2015/03/25 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书