学习
实践
活动
工具
TVP
写文章
专栏首页MyJavaJava基础(九) 动态代理

Java基础(九) 动态代理

代理分为静态代理和动态代理。

动态代理分为CGLIB代理和jdk动态代理,这里主要讲jdk动态代理。

静态代理

为每个目标类设置一个代理类,实现代理类的方法和接口,同时新增其他逻辑。

静态代理类 = 目标类 + 增强方法。

缺点:为每个类都要写自己的代理类,麻烦。而且多了之后业务逻辑非常非常复杂

动态代理

因为静态代理的缺点,动态代理的目的就是,少写或者不写代理类,却能完成代理功能。

原理:

关于对象的创建过程:

1,classloader加载类文件到内容

2,执行new,申请新的内存空间

3,调用构造器,创建空白对象

4,使用父类构造器(双亲委贷机制)

5,执行构造器内容

那么可以明白,创建一个对象的关键是,得到它的class文件然后进行调用。

所以动态代理,可以通过调用class类文件,然后通过反射机制生成相对应的代理类或者代理对象。

jdk动态代理:

因为我们不写代理类,但是我们需要构造器,字段啥的,这些数据要去哪里获取呢?这里可以通过代理类和目标类实现同一个的接口来完成,这样我们就可以通过接口来获取目标类的类信息。

jdk动态代理就是基于这个思想,也就是说jdk动态代理是基于接口实现的

实现

但是接口是不可以生成对象的,那怎么办呢?

jdk提供了两个对象,一个是invocationhandler接口和proxy类,两个类相互配合。

invocationhandler

通过实现这个接口表示生成代理类

public class RpcClientProxy implements InvocationHandler {
    private String host;
    private int port;

    public RpcClientProxy(String host, int port) {
        this.host = host;
        this.port = port;
    }

    @SuppressWarnings("unchecked")
    public <T> T getProxy(Class<T> clazz) {
        return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[]{clazz}, this);
    }
}

比如例子中rpcclientproxy就是代理类,他不需要实现目标类的东西了,只需要增强方法。

getProxy方法是用于生成代理对象的,多封装一层,方便。

实现invocationhandler接口,需要实现invoke的方法。

invoke方法用于表示代理对象的方法被调用时的动作。

@Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        RpcRequest rpcRequest = RpcRequest.builder()
                .interfaceName(method.getDeclaringClass().getName())
                .methodName(method.getName())
                .parameters(args)
                .paramTypes(method.getParameterTypes())
                .build();
        RpcClient rpcClient = new RpcClient();
        return ((RpcResponse) rpcClient.sendRequest(rpcRequest, host, port)).getData();
    }

相当于是增强方法。

proxy

用于生成代理对象或者代理类

getProxyClass(),生成代理类

Proxy.newProxyInstance(),生成代理实例,一般都用这个,比如类中的getProxy。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.syjhxy.ltd/复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

推荐阅读

  • 【5分钟玩转Lighthouse】区块链存证应用一键搭

    Lighthouse 长安链发布上线后在社区广受好评,同时也有不少社区朋友前来咨询小编如何基于Lighthouse 长安链开发自己的应用,比如区块链数字藏品、区块链存证、区块链游戏等等,那必须得安排。

    区块链首席推荐官
    SDKIDE存储区块链
  • 『航班乘客满意度』场景数据分析建模与业务归因解释 ⛵

    在过去几年中,客户对航空公司的满意度一直在稳步攀升。在 COVID-19 大流行导致的停顿之后,航空旅行业重新开始,大家越来越关注航空出行的满意度问题,客户也会对一些常见问题,如『不舒服的座位』、『拥挤的空间』、『延误』和『不合标准的设施』等进行反馈。

    ShowMeAI
    https网络安全数据处理特征工程
  • 非对称密钥沉思系列(1):RSA专题之PKCSv1.5填充模式下的选择性密文攻击概述

    本文主要梳理RSA 在PKCSv1.5 Padding模式下的 Oracle攻击。

    bowenerchen
    数据安全密钥管理服务
  • 别再被小程序置灰需求给坑了

    作为研发的我们,自然要第一时间跟进,既然各大平台跟进速度都很快,这个对我们来说肯定简单的很领导问我多久能够搞定,我满怀期待地说,5分钟搞定为了实现对应效果,最好的办法就是借鉴

    FE情报局
    小程序微信容器HTML
  • 世界杯太精彩了,带大家用Python做个足球游戏,边玩游戏边看比赛

    卡塔尔世界杯正是进行得火热,十六强队伍已经诞生,后面就是越来越紧张的争夺八强的淘汰赛。目前爆冷的赛果让球迷一度情绪失落,比如:日本2-1战胜西班牙,韩国2-1战胜葡萄牙。

    Lansonli
    游戏Python
  • Spring Boot3.0升级,踩坑之旅,附解决方案

    本文基于 newbeemall 项目升级Spring Boot3.0踩坑总结而来,附带更新说明:

    wayn
    SpringSpring BootMyBatisServletJava
  • 闲置台式机(Linux Debian)制作家用网关出口设备

    01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)

    bowenerchen
    私有网络
  • MySQL锁,锁的到底是什么?

    MySQL锁系列文章已经鸽了挺久了,最近赶紧挤了挤时间,和大家聊一聊MySQL的锁。

    蝉沐风
    数据库SQLMVCC云数据库 SQL Server
  • 消息验证码MAC入门指南

    简单来说,MAC就是随消息一起传输的标签或数据,可以通过MAC对消息进行验证,已确定消息是否被篡改过。

    bowenerchen
    数据安全数据加密服务
  • 是谁在控制互联网?

    在介绍本篇文章之前,需要复习一下域名注册流程以及简单的域名解析流程,见下图一图二;整篇文章的数据发生在下图的②和③步骤;

    hermanzeng
    DNS 解析 DNSPodDNS

扫码关注腾讯云开发者

领取腾讯云代金券