Java动态代理

什么是 Java 中的动态代理? 动态代理是 Java 提供的一种机制,它允许在运行时动态创建代理类和对象,而无需手动编写代理类的代码。代理对象可以在不改变目标对象代码的情况下,为目标对象扩展功能。 阅读详情
一、动态代理的背景
     之前我们应该学习过静态代理的使用,特征是代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理,较为麻烦。
所以我们需要一种不同于静态代理的代理机制来完成代理功能,即:最好可以通过一个代理类完成全部的代理功能。

二、什么是动态代理
    动态代理指的是客户通过代理类来调用其他对象(被代理类)的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。

三、代理设计模式的原理(静态代理、动态代理)
使用一个代理将对象包装起来,然后用该代理对象取代原始对象,任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。

四、静态代理例子回顾讲解
在这里我们先用一个衣服制造厂的例子回顾一下静态代理的使用:
第一步:创建接口
//衣服制造工厂(接口)
interface ClothFactory {
	void productCloth();
}
第二步:创建被代理类
//耐克生产工厂(被代理类)
class NikeClothFactory implements ClothFactory {

	@Override
	public void productCloth() {
		System.out.println("Nike工厂生产一批衣服!");
	}
}
第三步:创建代理类
//(代理类)
class ProxyFactory implements ClothFactory {
	ClothFactory cf;

	//创建代理类的对象时,实际传入一个被代理类的对象
	public ProxyFactory(ClothFactory cf) {
		this.cf = cf;
	}

	@Override
	public void productCloth() {
		System.out.println("代理类开始执行,收代理费1000元!");
		cf.productCloth();
	}
}
第四步:测试
public class TestClothProduct {
	public static void main(String[] args) {
		//创建被代理类的对象
		NikeClothFactory nike = new NikeClothFactory();
		//创建代理类的对象
		ProxyFactory proxy = new ProxyFactory(nike);
		proxy.productCloth(); 
	}
}
测试结果:

通过分析上面的代码我们总结一下静态代理的弊端:
①我们需要在运行前手动创建代理类,这意味着如果有很多代理的话会很麻烦。
②代理类和被代理类必须实现相同的接口,如果接口发生变动,代理类和被代理类都要作出相应的修改,容易出问题。
所以我们需要使用一个更为灵活的代理机制——动态代理

五、动态代理
第一步:创建接口
//(接口)
interface Subject {
	void action();
}
第二步:创建被代理类
//(被代理类)
class RealSubject implements Subject {

	@Override
	public void action() {
		System.out.println("我是被代理类,记得要执行我哦~~!");
	}

}
第三步:我们需要创建一个动态的代理类,要想创建动态代理类,我们要实现 InvocationHandler 接口
//动态代理都要用到InvocationHandler接口
class MyInvocationHandler implements InvocationHandler {
	Object object;//实现了接口的被代理类的对象的声明

	//①给被代理类的对象实例化
	//②返回一个代理类的对象
	public Object blind(Object object) {
		this.object = object;
		return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
	}

	//当通过代理类的对象发起对被 重写的方法的调用时,都会转化为对如下的invoke的调用
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//method方法的返回值时returnValue
		Object returnValue = method.invoke(object, args);
		return returnValue;
	}

}
这里我们来讲解一下 newProxyInstance() 方法中参数的含义
public static Object newProxyInstance(ClassLoader loader,
            Class<?>[] interfaces,
            InvocationHandler h)
            		throws IllegalArgumentException{
		//此处方法内容略去
	}
①ClassLoader loader:被代理类的类加载器,用来创建代理类。
②Class<?>[] interfaces:被代理类实现的接口,创建的代理类会实现这个接口。
③InvocationHandler h:实现了 InvocationHandler 接口的类对象,它只有一个 invoke 方法,是代理类进行拦截操作的入口。
第四步:测试
public class TestProxy {
	public static void main(String[] args) {
		//1.被代理类的对象
		RealSubject real = new RealSubject();
		//2.创建一个实现了InvocationHandler接口的类的对象
		MyInvocationHandler handler = new MyInvocationHandler();
		//3.调用blind()方法,动态的返回一个同样实现了real所在类实现的接口的代理类的对象
		Object obj = handler.blind(real);
		Subject sub = (Subject) obj;//此时的sub就是代理类的对象

		sub.action();//转到对InvocationHandler接口的实现类invoke()方法的调用

		//再举一个例子
		NikeClothFactory nike = new NikeClothFactory();
		ClothFactory proxyCloth = (ClothFactory) handler.blind(nike);//proxyCloth即为代理类的对象
		proxyCloth.productCloth();
	}
}
第五步:测试结果

这就是动态代理的使用,比较抽象,不是很容易接受,赶紧动手试试吧!

六、动态代理与AOP

    AOP即面向切面的编程,前面介绍的 Proxy 和 InvocationHandler 很难看出这种动态代理的优势,下面我们来简单介绍一下AOP这种更为实用的动态代理机制。


    在编程过程中,相同的代码多次出现会使代码冗余,我们一般都会采取将代码段放到一个方法中供我们多次调用来解决代码冗余问题,如图,如果代码段1、2、3和深色代码块分离开了,但代码段1、2、3又和一个特定的方法A耦合了!最理想的效果是:代码段1、2、3既可以执行方法A,又无需在程序中以硬编码的方式直接调用深色代码的方法。

下面我们举一个例子来说明一下:

第一步:创建接口

interface Human {
	void info();

	void fly();
}

第二步:创建被代理类

//被代理类	
class SuperMan implements Human {

	@Override
	public void info() {
		System.out.println("我是超人!我怕谁!");
	}

	@Override
	public void fly() {
		System.out.println("I believe I can fly!");
	}
}
第三步:创建相同代码段组成的工具类,方便调用

class HumanUtil {
	public void method1() {
		System.out.println("=======方法一=======");
	}

	public void method2() {
		System.out.println("=======方法二=======");
	}
}

第四步:创建实现InvocationHandler接口的类

class InvocationHandlerTest implements InvocationHandler {
	Object obj;//被代理对象的声明

	public void setObject(Object obj) {
		this.obj = obj;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		HumanUtil hu = new HumanUtil();
		//调用工具类中的通用方法
		hu.method1();
		//回调目标对象的方法
		Object returnValue = method.invoke(obj, args);
		//调用工具类中的通用方法
		hu.method2();
		return returnValue;
	}
}

第五步:动态的创建一个代理类的对象

class MyProxy {
	//动态的创建一个代理类的对象
	public static Object getProxyInstance(Object obj) {
		InvocationHandlerTest handler = new InvocationHandlerTest();
		handler.setObject(obj);
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
	}
}
第六步:测试

public class TestAOP {
	public static void main(String[] args) {
		//创建了一个被代理类的对象
		SuperMan man = new SuperMan();
		//返回一个代理类的对象
		Human hu = (Human) MyProxy.getProxyInstance(man);
		//通过代理类的对象调用重写的方法
		hu.info();
		System.out.println();
		hu.fly();
	}
}
测试结果:


    面向切面的编程这一部分仅作了解,如果理解起来比较困难,可以通过下面这张图体会一下AOP的整个运转流程。




Java 动态代理详解 Java 动态代理详解,包括JDK动态代理和CGLIB动态代理 阅读详情

相关推荐

别再傻傻分不清!一文讲透电子产品‘冲击’与‘碰撞’试验的区别与选用(附GB/T 2423标准解读)

本文详细解析了电子产品可靠性测试中冲击与碰撞试验的核心区别与应用场景,结合GB/T 2423标准提供实用指南。冲击测试模拟瞬时高强度事件(如跌落),而碰撞测试针对重复性力学环境(如运输颠簸)。通过参数对比和标准解读,帮助研发人员精准选择测试方案,提升产品可靠性验证效率。

weixin_42665255的博客 267

Java中的动态代理

Java中的动态代理

qingfengmax的博客 5625

从CCS3.3到CCS10:工程迁移与开发环境升级全攻略

本文详细介绍了从CCS3.3迁移到CCS10的完整流程与实战指南。针对老旧DSP项目,阐述了升级的必要性,并逐步指导CCS10的安装配置、界面操作、核心的工程移植步骤,以及移植后常见的代码调整与问题解决方案,帮助开发者高效完成开发环境升级,充分利用新版本的工具链提升开发效率。

weixin_29304985的博客 378

聊聊Java中的动态代理机制

代理模式涉及一个代表或代理对象,该对象与真实对象具有相同的接口。代理对象在不直接暴露真实对象的情况下,控制对真实对象的访问。动态代理的实现依赖于Java的反射机制。反射是一种在运行时检查或修改程序行为的能力。通过反射,我们可以在运行时获取类的信息、创建对象、调用方法、访问字段等。动态代理的第一步是定义一个或多个接口。这些接口将由真实对象和代理对象实现。接口定义了代理对象可以调用的方法。

无远弗届 2198

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题,就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过,所以仅仅看文档可能理解有误,欢迎指出错误。首先扫个盲:MM2S指的是Memory map to stream. 读DDR. S2MM指的是steam to memory...

weixin_35908791的博客 1598

3DGS实战避坑指南:从零搭建到成功训练

本文详细介绍了3D Gaussian Splatting(3DGS)从环境配置到成功训练的实战避坑指南。涵盖git clone的正确使用、依赖安装的隐藏陷阱、CUDA版本兼容性解决方案、首次训练验证、常见报错急救方案、性能优化技巧及可视化调试方法,帮助开发者高效搭建和训练3DGS模型。

weixin_29053383的博客 366

java代理

java代理模式

rockstore的博客 301

SkyWalking跨线程Trace传递实战:手把手教你用RunnableWrapper解决异步链路中断问题

本文深入解析了SkyWalking在异步编程场景下链路追踪中断的根源,并提供了使用RunnableWrapper等官方包装类的实战解决方案。通过详细的原理解析和代码示例,手把手指导开发者如何实现跨线程的Trace传递,确保分布式系统监控链路的完整性,有效解决异步任务导致的链路中断问题。

sand8的博客 495

【Java】动态代理技术

静态代理:在编译期确定代理类,即我们需要手动编写代理类。在这种情况下,代理类与目标类需要实现相同的接口。虽然静态代理能够增强方法,但它不够灵活,因为每次新增接口或方法都需要编写新的代理类。动态代理:在运行时动态创建代理类。Java动态代理主要基于接口进行代理,使用类和接口。动态代理通过反射机制实现,不需要手动编写代理类,能够动态地为接口生成代理类。// 定义用户服务接口// 实现接口的具体类@OverrideSystem.out.println("添加用户: " + name);

u013675821的博客 2919

基于奥比中光Orbbec Astra Pro与ROS实现实时3D环境建模:orb_slam2实战指南

本文提供了一份详细的实战指南,介绍如何使用奥比中光Orbbec Astra Pro深度摄像头与ROS系统,部署并运行ORB-SLAM2算法,实现实时3D环境建模与定位。内容涵盖从驱动安装、环境配置、算法编译到摄像头标定与性能调优的全流程,旨在帮助开发者快速搭建一套高性价比的视觉SLAM系统。

weixin_29054399的博客 337

STM32裸机开发基础:寄存器直接操作详解

寄存器是微控制器内部的特殊存储单元,直接与硬件电路连接,用于控制和监视硬件功能。与普通内存不同,寄存器的每一位(bit)通常都有特定的硬件含义。寄存器就是机器的控制面板上的各种开关和指示灯每个开关控制一个具体功能(如打开LED、启动通信)每个指示灯显示一个具体状态(如数据接收完成、错误发生)// GPIO引脚定义1。

2401_88760782的博客 2187

仿JDK的动态代理模式

代理模式 : 给某一对象提供代理对象,并由代理对象控制具体对象的引用. 一、代理模式涉及的角色: (1)抽象主题角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替. (2)真实代理对象:定义了代理角色所代表的具体对象. (3)Proxy产生代理主题角色的类,根据不同的主题接口,动态产生加载相应的RealProxy并实现主题接口所定义的抽象方法

daide2012的博客 831

【Bug已解决】Codex CLI 报 stream disconnected before completion 解决方案

方案适用场景推荐指数更新根证书库社区验证的最常见根因⭐⭐⭐⭐⭐检查系统时间虚拟机/容器等特殊运行环境⭐⭐⭐⭐核对 base_url 配置排除证书问题后的下一步排查⭐⭐⭐⭐更换网络环境测试怀疑本地网络设备存在干扰⭐⭐⭐升级到最新版本已知版本缺陷的场景⭐⭐⭐⭐报错虽然表现形式很像网络连接问题,但社区排查的多个真实案例表明,很大一部分情况的根因其实是本机系统的 TLS 证书信任链异常或系统时间不准确,而不是单纯的网络质量问题。优先检查并更新系统根证书库,这是社区验证过的高频根因。

一键难忘的博客 8026

Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

上篇介绍了一下静态代理:Java中的代理模式——静态代理以及分析静态代理的缺点 也分析了一下静态代理的缺点: 1、由于静态代理中的代理类是针对某一个类去做代理的,那么假设一个系统中有100个Service,则需要创建100个代理类 2、如果一个Service中有很多方法需要事务(增强动作),发现代理对象的方法中还是有很多重复的代码 3、由第一点和第二点可以得出:静态代理的重用性不强 那怎...

曹举的个人博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

java动态代理

前段时间去学习了一下RPC原理,其中提到了动态代理。特意去学习了一下,为了防止以后忘记,写下这篇博客做个记录,有不对的地方欢迎指正。 java中的常见的动态代理如Spring AOP。关于动态代理首先需要了解代理模式,根据代理类的创建时间又可以分为静态代理和动态代理。 1、代理模式 代理模式是常见的设计模式之一,Java我们通常通过new一个对象然后调用其对应的方法来访问我们需要的服务。代理模式则...

飞!!!的博客 5万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java动态代理分析

Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地制定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分配到委托对象上反射执行,配置执行过程中,开发人员还可以进行修改代理设计模式代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息、过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

小楼一夜听春雨 1万+

java动态代理和cglib动态代理

Java 动态代理和Cglib动态代理

leon709的专栏 1万+

java动态代理详解

目前java动态代理的实现分为两种 1.基于JDK的动态代理 2.基于CGILB的动态代理 在业务中使用动态代理,一般是为了给需要实现的方法添加预处理或者添加后续操作,但是不干预实现类的正常业务,把一些基本业务和主要的业务逻辑分离。我们一般所熟知的Spring的AOP原理就是基于动态代理实现的。 1.基于JDK的动态代理 基于JDK的动态代理就需要知道两个类:1.InvocationHa...

julyone的博客 7万+

Java 之动态代理详解

动态代理就像是一位神奇的魔术师,它能悄无声息地在你的代码运行时,为你的对象添加各种功能,而这一切,你不需要修改任何已有的代码!

weixin_64178283的博客 1707

JAVA动态代理

动态代理是Java实现AOP的核心技术,通过运行时生成代理对象解耦业务逻辑与非功能性需求。JDK动态代理适用于接口代理,CGLIB适用于无接口的类代理。实际开发中,优先选择JDK动态代理;若目标类无接口,则使用CGLIB。

2401_89221445的博客 1081

java动态代理详细介绍

java动态代理详细介绍

weixin_47874230的博客 1609

Java的动态代理

Java动态代理是Java提供的一种代理机制,允许在运行时动态生成代理类并为接口创建代理对象[@1@][@3@]。这种代理类能够拦截接口方法的调用,并在调用过程中添加自定义逻辑。Java的动态代理提供了一种灵活的方式来创建代理对象,并且可以在不修改原有代码的基础上扩展或改变行为。虽然JDK原生支持的动态代理只能对接口进行代理,但结合CGLIB等第三方库,我们可以构建出更加健壮和灵活的应用程序架构。无论是开发新的应用还是优化现有系统,理解并掌握动态代理的概念和技术都是非常有价值的。

kfepiza的博客 1259
上一篇: Java反射机制
下一篇: Java网络编程
sdecode
博客等级 码龄10年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值