首页 > 其他分享 >动态代理

动态代理

时间:2024-03-24 13:34:48浏览次数:26  
标签:test1 test2 对象 代理 动态 方法 public

1.创建接口

public interface iTestDemo {
void test1();
void test2();
}

2.创建类接入接口并对方法进行重写

public class iTestDemoImpl implements iTestDemo {
@Override
public void test1() {
System.out.println("执行test1方法");
}

@Override
public void test2() {
    System.out.println("执行test2方法");
}

}

3.创建Test类接入接口,根据多态性用接口接收重写过的类的对象,并对需求进行实现。

public class test3 {//这是代理对象
public static void main(String[] args) {
iTestDemo test = new iTestDemoImpl();//用接口接收对象

test.test1();
test.test2();

/** 需求:
* 在执行方法时,需要加入一些东西
* 在执行方法前打印test1或test2开始执行
* 在执行方法后打印test1和test2执行完毕
* 打印的方法名要和调用的方法保持一致
*/

4.创建动态代理类ProxyDemo 并接入接口InvocationHandler,设置一个被代理对象参数Object类的obj,通过构造方法把obj对象引入

public class ProxyDemo implements InvocationHandler{

Object obj;//被代理的对象

public ProxyDemo(Object obj){ //通过构造方法把对象引入
    this.obj = obj;

}

5.对InvocationHandler接口方法重写,通过method.invoke引入代理对象的指定方法,参数1是代理对象,参数2是参数类型,因为这里引用代理对象是无参方法,因此不填。
对构造方法使用任意类型进行接收,记得要强制转换。

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(method.getName() + "方法开始执行");
Student result =(Student) method.invoke(this.obj, args);//执行指定的代理对象的指定方法

    System.out.println(method.getName() + "方法执行完毕");
    return result;
}

6.在test3类中创建接收ProxyDemo类的对象的InvocationHandler类型接口,括号里是被代理的对象,将其引入ProxyDemo类中的构造方法。

InvocationHandler Handler = new ProxyDemo(test);

//InvocationHandler负责管理所有方法的调用。

7.直接通过JDK提供的一个Proxy.newProxyInstance()创建了一个iTestDemo接口对象。这种没有实现类但是在运行期动态创建了一个接口对象的方式,我们称为动态代码。返回的值
是成功被代理后的对象,由于JDK动态代理是基于接口实现的,因此要用接口去接收对象。(需要强转类型)

iTestDemo t = (iTestDemo) Proxy.newProxyInstance(Handler.getClass().getClassLoader(), test.getClass().getInterfaces(),Handler);

参数1是代理对象的类加载器;通过Handler.getClass获得代理对象的类,再.getClassLoader其加载器。
参数2是被代理对象的接口,用test.getInterfaces()获得。
参数3是代理对象也就是Handler。

8.调用构造方法运行代码。

t.test1();
t.test2();

程序运行:

test1方法开始执行
执行test1方法
test1方法执行完毕
test2方法开始执行
执行test2方法
test2方法执行完毕

标签:test1,test2,对象,代理,动态,方法,public
From: https://www.cnblogs.com/460759461-zeze/p/18092323

相关文章

  • 蓝桥杯—蓝肽子序列—动态规划
    蓝肽子序列dp[i][j]表示L1,L2前i,j个字段有多少个公共子序列,对于一个Xi和Yj(L1,L2的前i,j个字段形成序列.如果xi=yj(第i,j字段),则dp[i][j]=dp[i-1][j-1]+1(前面的公共字段加一).否则,dp[i][j]=max(dp[i-1][j],dp[i][j-1]),考虑前后情况的最大值。最后输......
  • P1002 [NOIP2002 普及组] 过河卒(动态规划)
    #include<bits/stdc++.h>usingnamespacestd;longlongdp[30][30];boolm[30][30];intmain(){ intAx,Ay,Mx,My; cin>>Ax>>Ay>>Mx>>My; Ax+=2;Ay+=2;Mx+=2;My+=2; dp[2][1]=1; m[Mx][My]=1; m[Mx-2][My-1]......
  • 【免费】基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计
    目录1 主要内容2 部分代码3 程序结果4下载链接1 主要内容该程序对应文章《PowerSystemDynamicStateEstimationUsing ExtendedandUnscentedKalmanFilters》,电力系统状态的准确估计对于提高电力系统的可靠性、弹性、安全性和稳定性具有重要意义,虽然近......
  • 配置动态刷新@RefreshScope引起的取值为null
    配置动态刷新@RefreshScope引起的取值为null 在SpringCloudConfig动态刷新demo编写中,分为三个步骤: 1)git端配置更改,代码提交 2)手动刷新配置: POST请求:http://localhost:3355/actuator/refresh  3)客户端访问配置:http://localhost:3355/testConfig 控制类代码如下:......
  • vue3 动态编译组件失败:Component provided template option but runtime compilation
    根据vue3官方文档路由,写了如下一个简单的页面来模拟路由的实现。为了减少*.vue文件的个数,在这个但页面中,使用defineComponent通过object定义组件。<scriptsetup>import{ref,computed,defineComponent}from'vue'constHome=defineComponent({template:`......
  • 数码管的动态显示
    1.共阴极数码管实现HELLO #include<reg51.h>charstr[]={0x76,0x79,0x38,0x38,0x3F};//HELLOcharwei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; voiddelay(intn){ inti=0,j=0; for(i=0;i<n;i++) { for(j=0;j<120;j++); }} voidseg(){ ......
  • 【OpenFeign】@FeignClient 代理对象的创建源码分析
    1 前言我们从上节 【OpenFeign】@FeignClient注入过程源码分析 继续,来看看它代理对象的创建,以及请求的执行过程。我们就从它的 FeignClientFactoryBean看起,那我们这里简单回忆下它都设置了哪些属性,我简单画了个图。这些属性不了解的话,就先看看上节哈,有详细的说明,我这里......
  • 100道面试必会算法-09-最大子数组和(初探动态规划)
    100道面试必会算法-09-最大子数组和(初探动态规划)题目一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,......
  • MyBatis3源码深度解析(二十)动态SQL实现原理(一)动态SQL的核心组件
    文章目录前言第八章动态SQL实现原理8.1动态SQL的使用8.1.1\<if>8.1.2<where|trim>8.1.3<choose|when|otherwise>8.1.4\<foreach>8.1.5\<set>8.2SqlSource组件&BoundSql组件8.3LanguageDriver组件8.3.1XMLLanguageDriver8.3.2RawLanguageDriver8.4Sq......
  • C语言进阶——动态内存管理
    目录一、C语言底层内存知识补充二、动态内存函数1.1free1.2malloc1.3calloc1.4realloc三、使用常见错误3.1对非动态开辟内存使用free释放3.2空指针未判断造成的错误3.3使用free释放一块动态开辟内存的一部分3.4对同一块动态内存多次释放3.5动态开辟内存没有释放而......