字节码编程bytebuddy之实现抽象类并并添加自定义注解
写在前面
本文看下使用bytebuddy如何实现抽象类,并在子类中添加自定义注解。
1:代码
1.1:准备基础代码
- 类和方法注解
package com.dahuyou.bytebuddy.cc.mine;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotationOnClazz {String loveThing() default "";int age();
}package com.dahuyou.bytebuddy.cc.mine;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotationOnMethod {String whatYouHate() default "every thing";long yourMoneyAmount() default 0L;
}
- 抽象类
package com.dahuyou.bytebuddy.cc.mine;public abstract class MyAbstractCls<T> {public abstract T sayHiMan(String param);
}
1.2:bytebuddy程序
package com.dahuyou.bytebuddy.cc.mine;import net.bytebuddy.ByteBuddy;
import net.bytebuddy.description.annotation.AnnotationDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatchers;
import java.io.File;public class TTTT {public static void main(String[] args) throws Exception {DynamicType.Unloaded<?> dynamicType= new ByteBuddy().subclass(TypeDescription.Generic.Builder.parameterizedType(MyAbstractCls.class, String.class).build()).name(MyAbstractCls.class.getName().concat(".").concat("MyAbstractClsImpl")).method(ElementMatchers.named("sayHiMan")) // 设置要拦截的方法.intercept(MethodDelegation.to(MyInterceptor.class)) // 设置执行具体逻辑的代理.annotateMethod( AnnotationDescription.Builder.ofType(MyAnnotationOnMethod.class).define("whatYouHate", "TMD,啥也不是啊").define("yourMoneyAmount", 350L).build()) // 设置类上的注解,以及其属性值.annotateType(AnnotationDescription.Builder.ofType(MyAnnotationOnClazz.class).define("loveThing", "啥也不是,啥也不管").define("age", 56).build()) // 设置方法上的注解以及其属性值.make();// 写到类文件中dynamicType.saveIn(new File(TTTT.class.getResource("/").getPath()));System.out.println("-----华丽的分割线----");// 获取类上的注解Class<MyAbstractCls<String>> aClass= (Class<MyAbstractCls<String>>) Class.forName("com.dahuyou.bytebuddy.cc.mine.MyAbstractCls.MyAbstractClsImpl");MyAnnotationOnClazz myAnnotationOnClazz = aClass.getAnnotation(MyAnnotationOnClazz.class);System.out.println("myAnnotationOnClazz.loveThing: " + myAnnotationOnClazz.loveThing());System.out.println("myAnnotationOnClazz.age: " + myAnnotationOnClazz.age());// 获取方法上的注解MyAnnotationOnMethod myAnnotationOnMethod = aClass.getDeclaredMethod("sayHiMan", String.class).getAnnotation(MyAnnotationOnMethod.class);System.out.println("myAnnotationOnMethod.whatYouHate: " + myAnnotationOnMethod.whatYouHate());System.out.println("myAnnotationOnMethod.yourMoneyAmount: " + myAnnotationOnMethod.yourMoneyAmount());System.out.println("-----华丽的分割线----");// 执行MyAbstractCls<String> stringMyAbstractCls = aClass.newInstance();System.out.println(stringMyAbstractCls.sayHiMan("helloooooo"));}
}
其中通过annotateMethod方法设置子类方法上的注解,通过annotateType设置子类类上的注解,运行一下:
-----华丽的分割线----
myAnnotationOnClazz.loveThing: 啥也不是,啥也不管
myAnnotationOnClazz.age: 56
myAnnotationOnMethod.whatYouHate: TMD,啥也不是啊
myAnnotationOnMethod.yourMoneyAmount: 350
-----华丽的分割线----
拦截了,参数是:hellooooooProcess finished with exit code 0
查看生成的字节码:
package com.dahuyou.bytebuddy.cc.mine.MyAbstractCls;import com.dahuyou.bytebuddy.cc.mine.MyAbstractCls;
import com.dahuyou.bytebuddy.cc.mine.MyAnnotationOnClazz;
import com.dahuyou.bytebuddy.cc.mine.MyAnnotationOnMethod;
import com.dahuyou.bytebuddy.cc.mine.MyInterceptor;@MyAnnotationOnClazz(loveThing = "啥也不是,啥也不管",age = 56
)
public class MyAbstractClsImpl extends MyAbstractCls<String> {@MyAnnotationOnMethod(whatYouHate = "TMD,啥也不是啊",yourMoneyAmount = 350L)public String sayHiMan(String var1) {return MyInterceptor.intercept(new Object[]{var1});}public MyAbstractClsImpl() {}
}
写在后面
参考文章列表
字节码编程bytebuddy之监控方法执行耗时 。
相关文章:
字节码编程bytebuddy之实现抽象类并并添加自定义注解
写在前面 本文看下使用bytebuddy如何实现抽象类,并在子类中添加自定义注解。 1:代码 1.1:准备基础代码 类和方法注解 package com.dahuyou.bytebuddy.cc.mine;import java.lang.annotation.ElementType; import java.lang.annotation.Re…...
LLM-阿里云 DashVector + ModelScope 多模态向量化实时文本搜图实战总结
文章目录 前言步骤图片数据Embedding入库文本检索 完整代码 前言 本文使用阿里云的向量检索服务(DashVector),结合 ONE-PEACE多模态模型,构建实时的“文本搜图片”的多模态检索能力。整体流程如下: 多模态数据Embedd…...
CentOS7安装部署git和gitlab
安装Git 在Linux系统中是需要编译源码的,首先下载所需要的依赖: yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker方法一 下载: wget https://mirrors.edge.kernel.org/pub/s…...
《昇思25天学习打卡营第16天|基于MindNLP+MusicGen生成自己的个性化音乐》
MindNLP 原理 MindNLP 是一个自然语言处理(NLP)框架,用于处理和分析文本数据。 文本预处理:包括去除噪声、分词、词性标注、命名实体识别等步骤,使文本数据格式化并准备好进行进一步分析。 特征提取:将文…...
算法学习day10(贪心算法)
贪心算法:由局部最优->全局最优 贪心算法一般分为如下四步: 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 一、摆动序列(理解难) 连续数字之间的差有正负的交替&…...
卡尔曼滤波Kalman Filter零基础入门到实践(上部)
参考视频:入门(秒懂滤波概要)_哔哩哔哩_bilibili 一、入门 1.引入 假设超声波距离传感器每1ms给单片机发数据。 理论数据为黑点, 测量数据曲线为红线,引入滤波后的数据为紫线 引入滤波的作用是过滤数据中的噪声&a…...
力扣-dfs
何为深度优先搜索算法? 深度优先搜索算法,即DFS。就是找一个点,往下搜索,搜索到尽头再折回,走下一个路口。 695.岛屿的最大面积 695. 岛屿的最大面积 题目 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相…...
keepalived高可用集群
一、keepalived: 1.keepalive是lvs集群中的高可用架构,只是针对调度器的高可用,基于vrrp来实现调度器的主和备,也就是高可用的HA架构;设置一台主调度器和一台备调度器,在主调度器正常工作的时候࿰…...
文献翻译与阅读《Integration Approaches for Heterogeneous Big Data: A Survey》
CYBERNETICS AND INFORMATION TECHNOLOGIES’24 论文原文下载地址:原文下载 目录 1 引言 2 大数据概述 3 大数据的异构性 4 讨论整合方法 4.1 大数据仓库(BDW) 4.2 大数据联盟(BDF) 5 DW 和 DF 方法的比较、分…...
应用最优化方法及MATLAB实现——第3章代码实现
一、概述 在阅读最优方法及MATLAB实现后,想着将书中提供的代码自己手敲一遍,来提高自己对书中内容理解程度,巩固一下。 这部分内容主要针对第3章的内容,将其所有代码实现均手敲一遍,中间部分代码自己根据其公式有些许的…...
django的增删改查,排序,分组等常用的ORM操作
Django 的 ORM(对象关系映射)提供了一种方便的方式来与数据库进行交互。 1. Django模型 在 myapp/models.py 中定义一个示例模型:python from django.db import modelsclass Person(models.Model):name models.CharField(max_length100)age…...
Leetcode Java学习记录——树、二叉树、二叉搜索树
文章目录 树的定义树的遍历中序遍历代码 二叉搜索树 常见二维数据结构:树/图 树和图的区别就在于有没有环。 树的定义 public class TreeNode{public int val;public TreeNode left,right;public TreeNode(int val){this.val val;this.left null;this.right nu…...
华为HCIP Datacom H12-821 卷30
1.单选题 以下关于OSPF协议报文说法错误的是? A、OSPF报文采用UDP报文封装并且端口号是89 B、OSPF所有报文的头部格式相同 C、OSPF协议使用五种报文完成路由信息的传递 D、OSPF所有报文头部都携带了Router-ID字段 正确答案:A 解析: OSPF用IP报文直接封装协议报文,…...
element el-table实现表格动态增加/删除/编辑表格行,带校验规则
本篇文章记录el-table增加一行可编辑的数据列,进行增删改。 1.增加空白行 直接在页面mounted时对form里面的table列表增加一行数据,直接使用push() 方法增加一列数据这个时候也可以设置一些默认值。比如案例里面的 产品件数 。 mounted() {this.$nextTi…...
QT调节屏幕亮度
1、目标 利用QT实现调节屏幕亮度功能:在无屏幕无触控时,将屏幕亮度调低,若有触控则调到最亮。 2、调节亮度命令 目标装置使用嵌入式Linux系统,调节屏幕亮度的指令为: echo x > /sys/class/backlight/backlight/…...
实变函数精解【3】
文章目录 点集求导集 闭集参考文献 点集 求导集 例1 E { 1 / n 1 / m : n , m ∈ N } 1. lim n → ∞ ( 1 / n 1 / m ) 1 / m 2. lim n , m → ∞ ( 1 / n 1 / m ) 0 3. E ′ { 0 , 1 , 1 / 2 , 1 / 3 , . . . . } E\{1/n1/m:n,m \in N\} \\1.\lim_{n \rightar…...
JVM:SpringBoot TomcatEmbeddedWebappClassLoader
文章目录 一、介绍二、SpringBoot中TomcatEmbeddedWebappClassLoader与LaunchedURLClassLoader的关系 一、介绍 TomcatEmbeddedWebappClassLoader 是 Spring Boot 在其内嵌 Tomcat 容器中使用的一个类加载器(ClassLoader)。在 Spring Boot 应用中&#…...
蜂窝互联网接入:连接世界的无缝体验
通过Wi—Fi,人们可以方便地接入互联网,但无线局域网的覆盖范围通常只有10~100m。当我们携带笔记本电脑在外面四处移动时,并不是在所有地方都能找到可接入互联网的Wi—Fi热点,这时候蜂窝移动通信系统可以为我们提供广域…...
Sprint Boot 2 核心功能(一)
核心功能 1、配置文件 application.properties 同基础入门篇的application.properties用法一样 Spring Boot 2 入门基础 application.yaml(或application.yml) 基本语法 key: value;kv之间有空格大小写敏感使用缩进表示层级关系缩进不允…...
GitLab CI/CD实现项目自动化部署
1 GitLab CI/CD介绍 GitLab CI/CD 是 GitLab 中集成的一套用于软件开发的持续集成(Continuous Integration)、持续交付(Continuous Delivery)和持续部署(Continuous Deployment)工具。这套系统允许开发团队…...
数字电路模块化设计的艺术:Logisim-evolution中的层次化抽象实践
数字电路模块化设计的艺术:Logisim-evolution中的层次化抽象实践 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 在数字电路设计的世界里,复杂系统…...
ROS新手也能玩转AUBO i5:用MoveIt和Rviz在Ubuntu 20.04上实现机械臂可视化仿真与控制
ROS新手也能玩转AUBO i5:用MoveIt和Rviz在Ubuntu 20.04上实现机械臂可视化仿真与控制 机械臂控制一直是机器人开发中的核心课题,而ROS(Robot Operating System)为这一领域提供了强大的工具链。本文将带你从零开始,在Ub…...
STM32 的IIC通信接收和发送详解
STM32 的 IIC 通信:IIC 接收和发送详解 1. 前言 IIC,也常写作 I2C,是单片机开发中非常常用的一种同步串行通信协议。 在 STM32 项目中,很多外设模块都会使用 IIC 通信,例如: OLED 显示屏;EEPROM…...
实在Agent物流对账全流程自动化方案与落地案例:2026智享财务新标杆
在2026年5月这个生成式AI深度重构实体经济的关键周期,全球物流行业已全面跨入“智能体(Agent)常态化运营”时代。根据《2026年全球供应链数字化趋势报告》显示,超过65%的大型物流企业已部署了具备自主决策能力的智能体来替代传统的…...
Linux驱动调试利器:debugfs接口设计与实现详解
1. 项目概述:为什么我们需要debugfs?在Linux内核驱动的开发与调试过程中,我们常常面临一个核心痛点:如何在不重启系统、不重新编译驱动、甚至不借助复杂外部工具的情况下,实时地窥探驱动内部的状态、修改关键参数&…...
【法学研究效率革命】:NotebookLM如何将文献综述时间压缩73%?(20年法律AI实践者亲测)
更多请点击: https://codechina.net 第一章:NotebookLM法学研究辅助 NotebookLM 是 Google 推出的基于用户自有文档构建的 AI 助手,其核心能力在于对上传文本进行深度语义理解与上下文感知问答。在法学研究场景中,它可高效处理判…...
如何快速掌握ppInk:Windows平台上的终极屏幕标注工具指南
如何快速掌握ppInk:Windows平台上的终极屏幕标注工具指南 【免费下载链接】ppInk Fork from Gink 项目地址: https://gitcode.com/gh_mirrors/pp/ppInk 你是否曾经在演示时需要快速标注屏幕内容,却发现现有工具要么功能太简陋,要么操作…...
3个常见视频下载难题,猫抓扩展如何帮你一键解决?浏览器资源嗅探实战指南
3个常见视频下载难题,猫抓扩展如何帮你一键解决?浏览器资源嗅探实战指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你…...
数字孪生交互推演方法
数字孪生交互推演方法(Digital Twin Interactive Deduction Methodology)是用户为中心交互系统工程(UCI-SE)在研发设计、变型设计以及生产预测环节的最高技术形态 。它改变了传统数字孪生“只能看、不能动”的静态看板僵局&#x…...
Windows 11系统优化终极指南:免费提升性能与隐私保护的完整方案
Windows 11系统优化终极指南:免费提升性能与隐私保护的完整方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutt…...
