当前位置:首页 > CN2资讯 > 正文内容

Java动态代理(原创)java动态代理

14小时前CN2资讯

Java动态代理

在学习Spring的时候,对于书上经常讲的动态代理就是一知半解的,学习Spring框架的时候也是囫囵吞枣的
接下来让我来整理一下动态代理的学习思路

首先,什么是动态代理:

照我的理解就是; A想要调用B,但是它不直接调用B,它利用反射的机制创建了一个C,然后让C调用B,在C这个类调用B之前和之后呢,可以分别实现一些登录验证,打印日志之类的操作,然后再让A调用C,这个时候A即调用了B,且A和B的耦合度还降低了,还实现了更多的功能,简直一举两得,好处多多.
代理类在程序运行时创建的代理方式被称为 动态代理。 也就是说,这种情况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数。

接下来我先来创建一个ArrayList的动态代理,熟悉一下代理流程

package cn.ycl.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
public class test4 {
public static void main(String[] args) {
// 第一步,创建一个ArrayList对象
List<String> list = new ArrayList<String>();
// 第二步,利用Proxy代理类的newProxyInstance方法,生成一个目标代理类
Object newProxyInstance = Proxy.newProxyInstance(list.getClass().getClassLoader(),
list.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
return method.invoke(list, args);
}
});
// 第三步,利用list的代理类newProxyInstance调用list的方法
boolean add = ((List<String>) newProxyInstance).add("你好");
System.out.println(list);
}
}

结果:

好的,写完这个基本的ArrayList动态代理我感觉自己对代理流程更加清晰了,接下来就来搞一波,复杂一点的,完成前置增强和后置增强吧。
步骤:
①定义一个YCL接口
②定义一个YuanChangLiang类
③定义一个生产代理对象并调用的ProxyYuanChangLiang类

首先第一步,定义一个YCL接口

package cn.ycl.test;
//接口名字是我名字的拼音缩写,6不6?
public interface YCL {

void coding();
void playing();
}

第二步,定义一个YuanChangLiang类

package cn.ycl.test;
//这个类就相当于我前面说的 B
public class YuanChangLiang implements YCL{

@Override
public void coding() {
// TODO Auto-generated method stub
System.out.println("袁昌亮正在敲代码。。。");
}
@Override
public void playing() {
// TODO Auto-generated method stub
System.out.println("袁昌亮正在混吃等死。。。");
}
}

第三步.定义一个生产代理对象并调用的ProxyYuanChangLiang类

package cn.ycl.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//这个类就相当于我前面说的 A
public class ProxyYuanChangLiang {
public static void main(String[] args) {
//第一步, 按照前面写ArrayList的动态代理的经验,创建被代理类的实例对象
YuanChangLiang ycl = new YuanChangLiang();
// 第二步,利用Proxy代理类生成代理对象,这个实例对象就相当于我前面说的 C
YCL yclProxy = (YCL) Proxy.newProxyInstance(ycl.getClass().getClassLoader(), ycl.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在方法调用之前就是前置增强啦。。
if (method.getName().equals("coding")) {
System.out.println("hello,我是在打代码前面吗?");
return method.invoke(ycl, args);
}
if (method.getName().equals("playing")) {
// 在方法后面调用就是后置增强啦。。
Object invoke = method.invoke(ycl, args);
System.out.println("hello,我是在混吃等死后面吗?");
return invoke;
}
return null;
}
});
// 第三步,利用代理对象调用YuanChangLiang的方法,easy
yclProxy.coding();
yclProxy.playing();
}
}

结果:

结果可喜,待补充
以上是JDK代理方式,其实动态代理可以分为两种方式,除了JDK代理,还有CGLIB的代理方式,那么两者有什么区别呢。下面是我认为总结的比较好的一张图


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24805.html

    分享给朋友:

    “Java动态代理(原创)java动态代理” 的相关文章

    拥抱未来,中国电信cn2ipv6:引领网络新时代

    在当今数字化浪潮席卷全球的背景下,网络技术的革新成为推动社会进步的重要力量。作为互联网的基础设施,IP地址系统经历了从IPv4到IPv6的升级,而中国电信的cn2ipv6网络正是这一升级浪潮中的佼佼者。cn2ipv6不仅代表着技术的进步,更是下一代互联网的基石,为用户带来了前所未有的高效、稳定和安全...

    如何获取低价域名:选购指南与注意事项

    在当今数字化时代,网上存在着大量的低价域名和注册选项。低价域名通常是指那些价格较为便宜的域名,相比传统的域名选择,它们为个人和企业提供了更加实惠的选择。注册这些域名的方式多种多样,市场上也有许多能够提供成本效益高的选择,适合各类需求的用户。 在这个竞争激烈的网上环境中,很多人希望能以较低的成本建立自...

    Oracle 免费VPS:轻松入门云计算的最佳选择

    在了解Oracle免费VPS之前,先来看看Oracle Cloud。这是甲骨文公司推出的一项云服务,提供了一系列强大的计算和存储资源。Oracle Cloud的最吸引人的部分是它的免费服务,给用户提供了机会,可以在没有经济负担的情况下体验云计算的强大功能。对于开发者、创业者或只是想进行一些小项目的用...

    台湾VPS:高效、稳定且安全的虚拟专用服务器解决方案

    台湾VPS,即虚拟专用服务器,是一种通过虚拟化技术将物理服务器划分为多个独立服务器的解决方案。这种服务不仅为用户提供独享的资源和灵活的管理权限,还能够提升性能和效率。在我使用台湾VPS的过程中,它让我深刻体会到这一技术的便利与强大。 台湾VPS的独特之处在于其地理位置和网络基础设施。位于东亚的台湾,...

    BBR脚本:提升Linux服务器网络性能的最佳选择

    BBR的基本概念 在近年来的网络技术发展中,BBR脚本不可不提。作为Google提出的拥塞控制算法,它带来了显著的性能提升。我常常会把BBR比作一位聪明的交通指挥官,它通过实时监测网络的瓶颈带宽和往返时间,像调节交通流量一样动态调整数据传输速率。这使得使用BBR的Linux服务器能够在面对不同网络条...

    Vultr注册送50美元优惠活动详细指南

    Vultr新用户注册活动概述 在寻找合适的云服务提供商时,我总是觉得选对平台会显得尤为重要。Vultr做为一个非常受欢迎的云服务提供商,给新用户带来了一项非常吸引人的优惠活动——注册即送50美元。这个活动让我感到非常兴奋,也让更多人有机会体验到高性价比的VPS服务。 这项活动非常简单易行。新用户只需...