Java设计模式——动态代理dynamicProxy

最佳解决Maven同一依赖多版本共存问题,重复依赖(同一个jar包,多个版本)-maven-shade-plugin 公司的历史项目在导出功能上引用的是poi-3.12版本,后续再做word模板导出功能时用到了poi-3.15版本,升级完后发现项目的很多导出功能都瘫痪了。用旧版本,新功能无法使用;用新版本,旧功能瘫痪,且整改的工作量比较大。使用maven-shade-plugin,将某个版本的依赖名称进行修改,重新引入即可。 阅读详情

一、动态代理设计图


二、动态代理概述

动态代理是JDK5 提供的一种新特性。其特点在于在程序的运行时刻动态的创建出代理类及其对象,而不像我们使用静态代理时必须在编译之前定义好代理类。在运行时刻,框架帮我们动态的创建出一个实现了多个接口的代理类,每个代理类的对象都会和一个InvocationHandler接口的实现类相关联。当我们调用了代理对象所代理的接口中的方法的时候,这个调用的信息会被传递给InvocationHandler的invoke方法。在 invoke方法的参数中可以获取到代理对象、方法对应的Method对象和调用的实际参数(内部是通过反射来实现的)。 invoke方法的返回值被返回给使用者,至于返回什么值可以由自己来定义,这种做法实际上相当于对方法调用进行了AOP拦截。

三、创建动态代理的步骤

(1)、创建被代理类以及接口。

(2)、创建一个实现接口InvocationHandler的类,它必须实现invoke方法。

(3)、通过Proxy的静态方法newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)创建一个代理。

(4)、通过代理来调用方法(此代理实现了被代理类的接口)。

四、实例分析

在userService 中,调用getName()前后加上一句话,如果直接在userService的方法中添加,会破坏源文件,此时可以写个代理对象,当执行getName()方法时,在其前后添加相应的行为。

(1)、创建接口和被代理类。

接口:

package org.wangkeqing.proxy;
public interface UserService {
    public String getName(int id);
    public Integer getAge(int id);
}

被代理类:

package org.wangkeqing.proxy;
public class UserServiceImpl implements UserService {
	@Override
	public Integer getAge(int id) {
		System.out.println("------getAge------");
        	return 10;
	}
	@Override
	public String getName(int id) {
		System.out.println("------getName------");
        	return "Tom";
	}
}

(2)、创建一个实现接口InvocationHandler的类,它必须实现invoke方法。

package org.wangkeqing.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 代理类 <br>
 * @author wkq
 */
public class MyInvocationHandler implements InvocationHandler {
	private Object target;
    	MyInvocationHandler() {
        	super();
    	}
    /**
     * 代理类的构造方法 <br>
     * @param target 被代理的类 <br>
     */
    MyInvocationHandler(Object target) {
        super();
        this.target = target;
    }
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
	//在执行getName()方法前后做些事情
	if("getName".equals(method.getName())){
            System.out.println("method  before " + method.getName() + "-----------");
            Object result = method.invoke(target, args);
            System.out.println("method  after " + method.getName() + "-------------");
            return result;
        }else{
            System.out.println("-------------------------分割线-------------------------------");
            Object result = method.invoke(target, args);
            return result;
        }
	}
}

(3)、通过Proxy的静态方法newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)创建一个代理。通过代理类来调用方法(此代理实现了被代理类的接口)

package org.wangkeqing.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Main1 {
	public static void main(String[] args) {
	    //获取UserService的实现类实例
	    UserService userService = new UserServiceImpl();
	    //获取代理对象
            InvocationHandler invocationHandler = new MyInvocationHandler(userService);
        //第一个参数为被代理类的类加载器,第二个参数为被代理类的接口,第三个参数为代理对象
        UserService userServiceProxy =
            (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(), invocationHandler);
        //通过代理对象调用方法
        System.out.println(userServiceProxy.getName(1));
        System.out.println(userServiceProxy.getAge(1));
	}
}

执行结果如下:

method  before getName-----------
------getName------
method  after getName-------------
Tom
-------------------------分割线-------------------------------
------getAge------
10

可以看出,在执行getName()方法前后都添加了一句话。

五、注意一下两个方法参数

(1)Object  invoke(Object proxy, Method method, Object[] args)    :在代理实例上处理方法调用并返回结果。

invoke方法其实是反射里边的一个方法,在这个方法中有三个参数:

    Ojbect proxy:表示需要代理的对象

    Method method:表示要操作的方法

    Object[] args:method方法所需要传入的参数(可能没有为,null.也可能有多个)

(2)public static ObjectnewProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h)
     该方法返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序.方法中有三个参数:

参数:

     loader - 定义代理类的类加载器

     interfaces - 代理类要实现的接口列表

     h - 指派方法调用的调用处理程序

   返回:

    一个带有代理类的指定调用处理程序的代理实例,它由指定的类加载器定义,并实现指定的接口。

京东风控算法工程师带你解读Action Model-精细化运营(上篇) 电影《蝴蝶效应》中,男主拥有回到童年改变过去的能力,虽然在剧中男主一次次穿越时空拯救世界,但由于他无法预见自己做出的抉择对未来产生的其他影响,最终还是没能阻止悲剧的发生。可见,一个好的决策需要衡量其对未来产生的影响。JDD风控算法团队本期为大家解惑最优决策难题的解决方法-Action Model。 阅读详情

相关推荐

小鹏P7车载以太网诊断实战:从OBD口定义到DoIP协议验证

本文详细解析了小鹏P7车载以太网诊断的实战过程。从OBD接口的针脚定义入手,依据ISO13400标准,确认了以太网线对位置,并指导制作专用的RJ45转OBD线束。通过搭建测试环境,使用Ping、端口扫描及Wireshark抓包,最终成功验证了车辆对DoIP协议的支持,为基于以太网的高速诊断与刷写提供了完整的技术路径。

CAT789的专栏 526

对动态代理(DynamicProxy)的理解

1、动态代理属于AOP(面向切面编程)的一种思想。 2、代理对象和被代理对象都实现了相同接口。 3、动态代理是指系统根据要代理的接口,自动帮我们生成并编译代理类(实现了要代理接口),并将代理类中的代理逻辑抽象到 InvocationHandler 中,由开发者实现。静态代理中,我们需要自己实现代理类,将代理逻辑也写在代理类里面。而动态代理省去了我们自己写代理类的工作,系统只需要知道要代理的接口,然...

ganduwei的博客 1863

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 283

Java中的动态代理与静态代理的实现

动态代理(理解): 基于反射机制。 掌握的程度 什么是动态代理 ? 使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。 jdk动态代理,必须有接口,目标类必须实现接口, 没有接口时,需要使用cglib动态代理 动态代理能做什么 ? 可以在不改变原来目标方法功能的前提下, 可以在代理中增强自己的功能代码。 程序开发中的意思。 比如:你所在的项目中,有一个功能是其他人(公司的其它部门,其

恒88888888的博客 412

深度学习入门:使用CMSIS-NN在微控制器上部署模型的完整指南与Python Jupyter实践

CMSIS-NN是ARM为Cortex-M系列微控制器设计的神经网络库。它旨在提供一套高效、轻量级的神经网络API,使得开发者可以在资源受限的微控制器上运行深度学习模型。CMSIS-NN优化了各种常见的神经网络层,如卷积层、全连接层等,确保它们在微控制器上的运行效率。# 定义模型])# 编译模型# 训练模型这样,我们就得到了一个简单的手写数字识别模型。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。为了获得完整的项目和更多的优化技巧,请下载完整项目。

m0_57781768的博客 5885

动态代理生成的类DynamicProxy

资料 JDK动态代理生成的class文件保存到本地失败问题(sun.misc.ProxyGenerator.saveGeneratedFiles) 将JDK动态代理生成的类保存为 .class文件System.setProperty(“sun.misc.ProxyGenerator.saveGeneratedFiles“, “true“)无效 https://www.cnblogs.com/qinggege/p/5288182.html 从代理模式再出发!Proxy.newProxyInstance的秘密

AdrianAndroid的专栏 945

在不同版本Python中安装PyQT5及PyQT5-Tools

在不同版本Python中安装PyQT5及PyQT5-Tools

zoomgu680的博客 2万+

10分钟看懂动态代理设计模式

动态代理是Java语言中非常经典的一种设计模式,也是所有设计模式中最难理解的一种。本文将通过一个简单的例子模拟JDK动态代理实现,让你彻底明白动态代理设计模式的本质,文章中可能会涉及到一些你没有学习过的知识点或概念。如果恰好遇到了这些知识盲点,请先去学习这部分知识,再来阅读这篇文章。 什么是代理 从字面意思来看,代理比较好理解,无非就是代为处理的意思。举个例子,你在上大学的时候,总是喜欢逃课。...

weixin_33778778的博客 3900

vue:npm安装pnpm报错,npm ERR! code ENOTFOUND,npm ERR! syscall getaddrinfo,npm ERR! errno ENOTFOUND详细排查解决!

vue2 vue3,npm install -g pnpm 安装出现错误,安装pnpm及解决安装失败问题,解决 npm无法安装pnpm问题,npm 安装 pnpm 时 报错 npm ERR! code ENOTFOUND,pnpm无法安装报错,vue npm install -g pnpm安装报错,request to http://registry.cnpmjs.org/pnpm failed, reason: getaddrinfo ENOTFOUND registry.cnpmjs.org,安装pnp

✅ 精选推荐文章 3609

基于 MFC 和 C++ 的语音识别客户端实现方案

语音 SDK:[Microsoft Speech SDK](https://learn.microsoft.com/zh-cn/azure/cognitive-services/speech-service/speech-sdk)(建议使用最新版)1. **Azure 语音服务密钥**:需要在 [Azure 门户](https://portal.azure.com/) 中创建语音资源,获取密钥和区域(如 `eastasia`),替换代码中的占位符。

寒寒豆豆软件公司的博客 156

jdk Dynamic Proxy 动态代理

说到动态代理,首先介绍下静态代理,静态代理是指首先有一组对外开放的接口,已知A类实现了此类接口,那么现在代码一个代理类B同样实现了接口中的方法,这样在方法中调用被代理类A中相应的方法,在调用前后,可以加上一些处理代码,如日记记录,事务开启关闭等等。 而动态代理,关键一点就是动态,即将这种代理关系,延迟到jvm运行是来实现。相同需要一组对外接口,代理类实现InvocationHandler接口并实

无意摘花 6247

从VLM到VLA概论

智驾视觉大模型

xiaomu_347的博客 1718

java设计模式_动态代理(dynamicProxy)

请原谅,我感觉这篇文章真心很难写,在纠结自己是否能说明问题之后,还是尽自己最大的努力,来说说我的对动态代理的理解。本人菜鸟,刚刚学习设计模式,单身勿喷。   按照新华词典的翻译,代理:“法律上指以他人的名义,在授权范围内进行对被代理人直接发生法律效力的法律行为。代理的产生,有的是受他人委托,有的是由法律规定,有的是由有关部门指定。如在诉讼中,当事人聘请律师代理进行诉讼活动。有些行为如立遗嘱、婚姻

成长的烧年 1096

深度学习工具包 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")

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JDK动态代理机制

看个例子吧: 设计如下一个模型,Subject 是一个接口,RealSubject是其实现类。Proxy是用来代理RealSubject,生成一个代理对象。可以通过调用代理对象来起到调用RealSubject的效果。 时序图如下: talk is cheap ,show me the example. ok,接下来看看具体例子代码。 在java的动态代理机制中,有两个重要的...

我弟是个程序员 4885

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

菜鸟硕枫设计模式系列之13 代理模式二(动态代理)

java中的动态代理都需要实现一个实现了InvocationHandler接口的代理类,在该类中需要实现invoke方法,并且需要注入你想要代理的目标类对象实例。然后就可以对想要代理的方法进行操作了。 动态代理类图: [img]http://dl.iteye.com/upload/attachment/364557/9fa8...

dreaming架构师,充分践行,适当补充理论的一年 146

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java静态代理、动态代理

java静态代理与动态代理的区别: 1、静态代理只能代理一个接口或实现类。 2、静态代理如果接口类发生了变化,那么,实现类、代理类都要进行调整。 3、动态代理可以代理所有接口类,且也只能代理接口类。 由于时间关系,先写这么多,之后再补充代码部分吧。

Eisenhower讲堂 839

JAVA动态代理代码示例

概念理解 代理是一种软件设计模式,目的地希望能做到代码重用。代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法。这个就好比 商户---->明星经纪人(代理)---->明星这种模式。我们可以不通过直接与明星对话的情况下,而通过明星经纪人(代理)与其产生间接对话,JAVA中的代理分为两种。 静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行...

lishentao_1122的博客 1845

Java设计模式-代理模式

概念 为其它对象提供一种代理以控制对这个对象的访问。 角色说明 Subject: 抽象主题类,声明真实主体与代理主题的共同接口方法。 RealSubject: 真实主题类,定义了真实对象的业务方法,供代理类来调用。 ProxySubject: 代理类,持有一个真实类的引用,在接口方法中调用真实主题(RealSubject)相应的方法。 实例静态代理 1.创建subject(买

薛定谔的猫 288

Java 静态代理和动态代理 示例

只是自己学习时写的程序,只作为记录用,不是很正式的程序,也懒得百度一堆概念放在这里,没啥意思,直接上程序。 静态代理: 接口: package StaticProxy; public interface IPerson { void say(); } 实现类: package StaticProxy; public class Man implements IPerson ...

qq_22073239的博客 158

Java设计模式-----JDK动态代理(Dynamic Proxy)

接上文:4.1Java设计模式-----JDK静态代理(Static Proxy) JDK动态代理 JDK动态代理是指动态的在内存中构建代理对象(需要我们制定要代理的目标对象实现的接口类型),即利用JDK的API生成指定接口的对象,也称之为JDK代理或者接口代理。 动态代理代码部分,下面将做进一步分析。用到的Person接口和Student被代理类保持不变。 ...

扛麻袋的少年的博客 1951

java设计模式之动态代理

java设计模式之动态代理 简介 代理模式是java23种代理模式之一,就是用一个对象代理另一个对象,使它具有被代理对象的功能,并且能进行功能的上的修改(一般是修改方法)。 静态代理 在动态代理之前,我们先来看看静态代理。 其实我们在java基础里方法的多态也是一种代理了。 public interface Moveble { public void move(); } public ...

SuNew_bee的博客 286

think in java笔记:Dynamic Proxy

think in java笔记:Dynamic Proxyproxy是什么? Proxy is one of the basic design patterns. It is an object that you insert in place of the “real” object in order to provide additional or different opera

sutonline的博客 411

jdk中的动态代理源码分析

前言 图片来自https://www.cnblogs.com/maohuidong/p/7992894.html 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对这个对象的访问。为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同...

acehcl 243

设计模式之代理模式(Proxy)

1、定义 代理模式是一个使用率非常高的模式,它为其他对象提供一种代理以控制对这个对象的访问。 2、通用类图 subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求 RelSubject具体主题角色:也叫做被委托角色、被代理角色。是业务逻辑的具体执行者。 Proxy代理主题角色:也叫委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义...

weixin_30877227的博客 68

设计模式(七)代理模式

定义:为其他对象提供一种代理(中介),以控制这个对象的访问。对这个对象进行访问控制的一个原因是为了只有我们确实需要这个对象时才对它进行创建和初始化。   使用场景:   1、延迟加载。如果一个对象并不是在任何场景都需要,且这个对象的创建需要消耗不少资源。   2、对原有对象方法的增强。这些加强可能是一些日志操作,基于设计模式开闭原则的考虑,这些加强不可能放到原有真实类里面,所以就新增了一个代

xuzhelin的专栏 531
上一篇: Java编程基础——Annotation注解(三)
下一篇: Linux基础知识——增删改查用户
spring_model
博客等级 码龄11年 36粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值