Java的动态代理
发布日期:2021-11-04 11:54:24 浏览次数:19 分类:技术文章

本文共 1420 字,大约阅读时间需要 4 分钟。

目录


一、静态代码

定义一个接口如下:

public interface Flyable{    void flight();}

编写实现类如下:

public class Bird implements Flyable{    public void flight()    {        System.out.println("Brid fly in the sky!");    }}

创建实例,接口调用如下:

Flyable f = new Bird();f.flight();

 

二、动态代码

Java标准库提供了一种动态代理(Dynamic Proxy)的机制:可以在运行期动态创建某个interface的实例。

public class MainTest{    public static void main(String[] args)    {        Flyable f = (Flyable) Proxy.newProxyInstance(                Flyable.class.getClassLoader(), // 传入ClassLoader                new Class[] { Flyable.class },  // 传入要实现的接口                (proxy, method, ars) ->         // 传入处理调用方法的InvocationHandler                {                    System.out.println(method);                    if (method.getName().equals("flight"))                    {                        System.out.println("dynamic proxy, can fly too!");                    }                    return null;                });         f.flight();    }}

从上述代码中可以发现,主要是用Proxy的newProxyInstance方法对这个interface生成一个代理对象。

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

loader:选用的类加载器

interfaces:被代理的类所实现的接口,这个接口可以是多个。

h:绑定代理类的一个方法,public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;

 

动态代理是通过Proxy创建代理对象,主要是用反射来实现实例化的,然后将接口方法“代理”给InvocationHandler完成的。

动态代理其实一般很少去手写,但是却经常使用到。在Spring项目中用的注解是动态代理最佳的落地点,例如依赖注入的@Bean、@Autowired,事务注解@Transactional等。

转载地址:https://blog.csdn.net/WXS_0218/article/details/102716329 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java旧版本时间、日期处理
下一篇:几种任务调度的 Java 实现方法与比较

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月21日 12时24分53秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

android gp服务,ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用) 2019-04-21
mysql整体会滚_滚mysql 2019-04-21
向mysql数据库中添加批量数据类型_使用JDBC在MySQL数据库中快速批量插入数据 2019-04-21
最全的mysql 5.7.13_最全的mysql 5.7.13 安装配置方法图文教程(linux) 强烈推荐! 2019-04-21
mssql连接mysql数据库文件_在本地 怎么远程连接MSSQL数据库 2019-04-21
mssql 远程无法连接mysql_解决SQLServer远程连接失败的问题 2019-04-21
linux mysql c++编程_Linux下进行MYSQL的C++编程起步手记 2019-04-21
Maria数据库怎么复制到mysql_MySQL、MariaDB数据库的AB复制配置过程 2019-04-21
mysql5.6 icp mrr bak_【mysql】关于ICP、MRR、BKA等特性 2019-04-21
mysql utf8跟utf8mb4_MySQL utf8 和 utf8mb4 的区别 2019-04-21
docker mysql开机自启动_Docker学习4-学会如何让容器开机自启服务【坑】 2019-04-21
在mysql中删除表正确的是什么_在MySQL中删除表的操作教程 2019-04-21
mysql有3个共同好友_共同好友mysql 2019-04-21
代理查询 mysql_查询数据库代理设置 2019-04-21
mysql dif_mysqldiff实现MySQL数据表比较 2019-04-21
mysql 允许其他主机访问权限_允许其他主机访问本机MySQL 2019-04-21
druid不能close mysql连接_alibaba druid mysql连接问题 2019-04-21
mysql 设置按天分表_MySQL 优化实战记录 2019-04-21
java连接mysql 不推荐_java连接mysql 2019-04-21
mysql数据库 quota_shell脚本抓取用户存储quota写道mysql并展现到grafana面板 2019-04-21