动态代理 --java学习笔记

news2024/11/25 2:54:36

什么是动态代理?

当一个类的很多方法都存在重复冗杂的部分,就可以使用代理来处理那些重复部分的任务,到了各自的实现部分再丢回给原方法处理,同时也可以提高方法的扩展性,而动态则是指在运行时动态地创建代理对象,动态的调用方法

如何为Java对象创建一个代理对象?

java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:

代码演示动态代理的创建与使用:
Star接口:记录代理的方法

package com.zeyu.proxy;

public interface Star {
    String sing(String name);
    void dance();
}

原对象

package com.zeyu.proxy;

public class SuperStar implements Star{
    private String name;

    public SuperStar(String name){
        this.name = name;
    }

    public String sing(String name){
        System.out.println(this.name + "正在唱:" + name);
        return "谢谢大家!";
    }

    public void dance(){
        System.out.println(this.name + "正在跳舞~");
    }
}

代理

package com.zeyu.proxy;

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

public class ProxyUtil {
    public static Star createProxy(SuperStar superStar) {
        /*
         * 参数一:用于指定一个类加载器
         * 参数二:指定生成的代理长什么样子,也就是有哪些方法
         * 参数三:用来指定生成的代理对象要感什么事情
         * */
        Star starProxy = (Star) Proxy.newProxyInstance(SuperStar.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {
            @Override   //回调方法
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                /*
                * 三个形参:
                * proxy:动态生成的代理类
                * method:与代理类对象调用的方法相对应
                * args:当前method方法的参数
                * */
                //代理对象要做的事情,在这里写代码
                if (method.getName().equals("sing")) {
                    System.out.println("准备话筒,收钱20万");
                } else if (method.getName().equals("dance")) {
                    System.out.println("准备场地,收钱100万");
                }
                return method.invoke(superStar, args);

            }
        });
        return starProxy;
    }
}

测试类:

package com.zeyu.proxy;

public class Test {
    public static void main(String[] args) {
        SuperStar zeYu = new SuperStar("zeYu");
        Star proxy = ProxyUtil.createProxy(zeYu);

        String rs = proxy.sing("不为谁而作的歌");
        System.out.println(rs);

        proxy.dance();
    }
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1588185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法题解记录8+++爬楼梯(百日筑基)

题目描述: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶…

2024年【安全员-A证】最新解析及安全员-A证模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年【安全员-A证】最新解析及安全员-A证模拟考试题,包含安全员-A证最新解析答案和解析及安全员-A证模拟考试题练习。安全生产模拟考试一点通结合国家安全员-A证考试最新大纲及安全员-A证考试真题汇总&a…

AI投研分析,模块化赛道可能会出现新的头部公链

随着比特币ETF的通过,再加上比特币第四次减半临近,备受期待的新一轮牛市周期已经开启了,然而对于那些刚穿越过熊市的新韭菜而言,因为总觉得没这么快涨起来,而对二级市场交易变得非常谨慎,导致了很多新韭菜在…

Unity之Unity面试题(六)

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之Unity面试题(六) TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取…

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

情形:Spring配置类注解方式整合MyBatis 异常: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 解决: 检查mapper的全类名和mapper.xml的namespace是否一致检查mapper下的方法名和mapper.xml的sql的id是否…

电脑离线调用微信 ocr.exe 使用 python 调用 WeChatOCR.exe 附python代码

微信的OCR识别能力还是可以的,并且可以得到位置,速度也快,我想要把微信的这个exe 单独提取出来,可以供其他项目使用,目前已有的应该都是需要依赖微信运行状态的,我这个独一份 相当于把微信运行它的OCR的环境完全剥离出来,只需要几个代码文件加上几个模型文件就可以离线…

react antd 实现修改密码(原密码,新密码,再次输入新密码,新密码增加正则复杂度校验)

先看样子 组件代码: import React, { useState, useEffect } from react import { Row, Col, Modal, Spin, Input, Button, message, Form } from antd import { LockOutlined, EyeTwoTone, EyeInvisibleOutlined } from ant-design/icons import * as Serve from …

如何申请做快团团购帮卖团长?免费试用教程一学就会!

新手小白想要自己做快团团,有两种方法。 1、自己提供货源,自己开团做团长。 这种方法流程非常简单,从微信小程序中找到快团团,点击右上角“一键开团”,然后“创建普通团购”,按照操作设置就可以开团了。 …

Java高频面试之JVM篇

说一下 Jvm 的主要组成部分?及其作用? 类加载器执行器运行时数据区域本地接口 谈谈对运行时数据区的理解? 堆和栈的区别是什么? 堆中存什么?栈中存什么? 堆总存对象,栈中存局部变量,引用 为什么要把堆…

静音检测电路芯片D3703F——工 作 电 压 范 围 宽 : 3.2V ~ 16.0V,可以用于汽 车 音 响 系 统

概 述 : D3703F 是 一 块 汽 车 音 响 静 音 检 测 电 路 。 用 于 音 响 系 统 检 测 在 放 音 或 快 进 / 退 时 进 行 静 音 检 测 。 D3703F 的 的 电 压 范 围 : 3.2V ~ 16V , 信 号 检 测 和 静 音 时 间 可 通 过 外 围…

参花期刊投稿发表论文

《参花》是由国家新闻出版总署批准,吉林省文化和旅游厅主管,吉林省文化馆主办的正规文学类期刊。文学是用语言塑造形象反映社会生活的一种语言艺术,是自觉、独立而又面向整个社会的艺术,是文化中极具强烈感染力的重要组成部分&…

Java List基础篇

目录 前言一、常用List1.1 List1.1.1 特点1.1.2 常用API 1.2 ArrayList1.2.1 特点1.2.2 使用 1.3 LinkedList1.3.1 特点1.3.2 使用 1.4 CopyOnWriteArrayList1.4.1 特点1.4.2 使用 1.5 Arrays.asList()1.5.1 特点1.5.2 使用 二、对比总结 前言 一、常用List 1.1 List List是…

C++STL--谓词

谓词 ① 可调用的表达式称为谓词,包括仿函数,自定义函数,lambda表达式。 ② 接受一个参数的谓词,称为一元谓词。 ③ 接受两个参数的谓词,称为二元谓词。 可调用的表达式:对于一个对象或者表达式,如果可以使用调用运算符(),就称它为可以调用的。 一元谓…

2024年【T电梯修理】考试总结及T电梯修理考试技巧

题库来源:安全生产模拟考试一点通公众号小程序 T电梯修理考试总结考前必练!安全生产模拟考试一点通每个月更新T电梯修理考试技巧题目及答案!多做几遍,其实通过T电梯修理试题及解析很简单。 1、【多选题】修理工陶、陈&#xff0c…

李沐27_含并行连结的网络GoogLeNet_Inception——自学笔记

Inception块 1.四个路径从不同层面抽取信息,然后在输出通道维合并。 2.有更少的参数个数和计算复杂度(相比于3X3和5X5卷积层) GoogLeNet 1.五个stages,九个inception块 Inception各种后续变种 1.Inception-BN(V2)——使用ba…

SCI一区 | Matlab实现INFO-TCN-BiGRU-Attention向量加权算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测

SCI一区 | Matlab实现INFO-TCN-BiGRU-Attention向量加权算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现INFO-TCN-BiGRU-Attention向量加权算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测预测效果基本介绍模型描述程…

STL--pair 数对

pair 数对&#x1f357; pair是一个模板类,使用时需要引用文件 #include <utility>//通用工具pair可将两个value处理为一个元素。C标准库内多处用到了这个结构。尤其容器 map、unordered_map和unordered_multimap就是使用pair来管理其内部元素(key_value),任何函数如果…

MySQL一些特殊功能的索引(6/16)

特殊功能性索引 B-Tree索引&#xff1a; InnoDB的默认索引类型&#xff0c;适用于多种查询操作。 可以用于等值查询、范围查询和索引列的组合查询。 创建B-Tree索引的示例&#xff1a; CREATE INDEX index_name ON table_name (column1, column2);全文索引&#xff08;FULLTEX…

个人博客项目笔记_05

1. ThreadLocal内存泄漏 ThreadLocal 内存泄漏是指由于没有及时清理 ThreadLocal 实例所存储的数据&#xff0c;导致这些数据在线程池或长时间运行的应用中累积过多&#xff0c;最终导致内存占用过高的情况。 内存泄漏通常发生在以下情况下&#xff1a; 线程池场景下的 ThreadL…

Mysql内存表及使用场景(12/16)

内存表&#xff08;Memory引擎&#xff09; InnoDB引擎使用B树作为主键索引&#xff0c;数据按照索引顺序存储&#xff0c;称为索引组织表&#xff08;Index Organized Table&#xff09;。 Memory引擎的数据和索引分开存储&#xff0c;数据以数组形式存放&#xff0c;主键索…