首页 > 其他分享 >动态代理实现实例

动态代理实现实例

时间:2024-03-01 11:12:49浏览次数:18  
标签:实例 void 代理 System write InvocationHandler println 动态

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/*
  @author 12817
 */

/**
 * 学生接口,能跑,能吃,能写作文。
 */
interface Student {
    void eat();

    void run();

    void write();
}
/**
 * 小韭菜,能跑,能吃,能写作文。
 */
class OrdinaryStudents implements Student {
    @Override
    public void eat() {
        System.out.println("我在吃饭!");
    }

    @Override
    public void run() {
        System.out.println("我在跑步!");
    }
    @Override
    public void write() {
        System.out.println("我在写作文!");
    }
}
public class DynamicProxy {


    public static void main(String[] args) {
        // 小韭菜学生类
        Student ordinaryStudents = new OrdinaryStudents();
        ordinaryStudents.eat();
        ordinaryStudents.write();

        // 现在有一位特殊的学生,他是区长的儿子,我们自然要对他额外照顾,要给他加一下功能。
        // 一种思路是定义一个类:区长的儿子类,他继承自学生类,但世上儿子千千万,有区长的儿子,也有市长的儿子,更有省长的儿子,不能把他们挨个定义出来,
        // 现在就可以使用动态代理机制,动态的给区长的儿子加上功能,以后碰到市长、省长的儿子也同样处理。

        // InvocationHandler作用就是,当代理对象的原本方法被调用的时候,会重定向到一个方法,
        // 这个方法就是InvocationHandler里面定义的内容,同时会替代原本方法的结果返回。
        // InvocationHandler接收三个参数:proxy,代理后的实例对象。 method,对象被调用方法。args,调用时的参数。

        InvocationHandler handler = (proxy, method, handlerArgs) -> {
            // 从定义eat方法。
            if ("eat".equals(method.getName())) {
                System.out.println("我可以吃香喝辣!");
                return null;
            }
            // 从定义write方法。
            if ("write".equals(method.getName())) {
                System.out.println("我的作文题目是《我的区长父亲》。");
                // 调用普通学生类的write方法,流程还是要走的,还是要交一篇作文上去,不能太明目张胆。
                method.invoke(ordinaryStudents, handlerArgs);
                System.out.println("我的作文拿了区作文竞赛一等奖!so easy!");
                return null;
            }
            return null;
        };
        // 对这个实例对象代理生成一个代理对象。
        // 被代理后生成的对象,是通过People接口的字节码增强方式创建的类而构造出来的。它是一个临时构造的实现类的对象。
        // loder和interfaces基本就是决定了这个类到底是个怎么样的类。而h是InvocationHandler,决定了这个代理类到底是多了什么功能.
        // 通过这些接口和类加载器,拿到这个代理类class。然后通过反射的技术复制拿到代理类的构造函数,
        // 最后通过这个构造函数new个一对象出来,同时用InvocationHandler绑定这个对象。
        // 最终实现可以在运行的时候才切入改变类的方法,而不需要预先定义它。
        Student sonOfDistrict = (Student) Proxy.newProxyInstance(ordinaryStudents.getClass().getClassLoader(),
                ordinaryStudents.getClass().getInterfaces(),
                handler);
        sonOfDistrict.eat();
        sonOfDistrict.write();

    }
}

 

标签:实例,void,代理,System,write,InvocationHandler,println,动态
From: https://www.cnblogs.com/JavaYuYin/p/18046535

相关文章

  • Vue 3.0 应用&组件实例
    #创建一个应用实例每个Vue应用都是通过用 createApp 函数创建一个新的应用实例开始的: constapp=Vue.createApp({/*选项*/})  该应用实例是用来在应用中注册“全局”组件的。我们将在后面的指南中详细讨论,简单的例子: constapp=Vue.createApp({})ap......
  • aardio调用c语言dll动态库传结构体详细教程
    安装mingw32下载安装配置官方地址下载安装:https://sourceforge.net/projects/mingw/安装方法:https://blog.csdn.net/HandsomeHong/article/details/120803368↑记得最后要添加一下环境变量mingw64编译32位失败,待继续研究。https://zhuanlan.zhihu.com/p/413181676#安装完成......
  • 解决Nginx代理转发中HTTP到HTTPS跳转问题的技术方案解析
    在进行Nginx代理转发时,经常会遇到HTTP到HTTPS跳转的问题,特别是在某些情况下,即使在程序中明确指定了使用HTTPS协议,仍然会出现跳转到HTTP的情况。本文将介绍一种解决这个问题的技术方案,并对问题的原因进行分析。问题描述在进行Nginx代理转发时,配置了HTTPS支持,但在程序中发起请求时......
  • day50 动态规划part7 代码随想录算法训练营 279. 完全平方数
    题目:279.完全平方数我的感悟:看文字也行理解难点:物品是什么?是i*i<n的集合听课笔记:代码示例:classSolution:defnumSquares(self,n:int)->int:#完全背包问题#顺序没关系,组合把#递推公式难想,dp[j]=min(dp[j],dp[j-i*i]+1)......
  • day50 动态规划part7 代码随想录算法训练营 322. 零钱兑换【什么时候+1】
    题目:322.零钱兑换我的感悟:看着文字版也能做出来了,哈哈哈!!理解难点:这题是最小值dp[j]=min(dp[j],dp[j-coins[i]+1)因为是数量要加一个1,有的加,有的不加,还没太搞清楚。 听课笔记: 代码示例:classSolution:defcoinChange(self,coins:List[int],amount:int......
  • 今日补充练习-动态规划算法part7-卡尔57爬楼梯进阶
    注意点&感悟:多练习注意体会跟昨天的组合问题的区别。注意物品的边界题目链接:卡尔57爬楼梯进阶自己独立写的代码:#完全背包问题--下的求种类问题#物品是m,有限的#背包是ntotal,m=map(int,input().split())dp=[0]*(total+1)dp[0]=1forjinrange(total+1):......
  • 复习回顾-动态规划算法part6-377. 组合总和 Ⅳ
    注意点&感悟:跟卡尔的57题不一样,57爬楼梯,物品是m,背包是total总台阶数量,每次爬楼梯的m个foriinrange(1,m+1)选择是有限的377组合是,给的nums是物品,背包是target目标,每次这些物品都能选,选择是全部遍历一遍。foriinrange(len(nums)) 全部遍历题目链接:377.组合总和Ⅳ......
  • day44 动态规划part7 代码随想录算法训练营 70. 爬楼梯 (进阶)
    题目:爬楼梯(进阶)-在卡尔网我的感悟:昨天最后没怎么听懂的,今日回旋镖来了。理解难点:递推公式,和遍历顺序手写笔记:代码示例:total,m=map(int,input().split())#每次爬m个#dp[i]含义是爬到i有dp[i]种方法#是完全背包问题dp=[0]*(total+1)dp[0]=1fo......
  • R语言GAMLSS模型对艾滋病病例、降雪量数据拟合、预测、置信区间实例可视化|附代码数据
    全文链接:http://tecdat.cn/?p=31996原文出处:拓端数据部落公众号最近我们被客户要求撰写关于GAMLSS的研究报告,包括一些图形和统计输出。GAMLSS模型是一种半参数回归模型,参数性体现在需要对响应变量作参数化分布的假设,非参数性体现在模型中解释变量的函数可以涉及非参数平滑函数,......
  • 国信长天51数码管动态显示消隐
    for(i=0;i<4;i++){ P0=Seg_Wei[i];HC573(6);P0=Seg_Duan[i+1];HC573(7);delayMs(1000); //设1s相当于几个数码管1秒轮播:挨着亮流水灯一样显示//所以如果想动态显示就要利用"视觉效应"吧时间设短点......