字节码编程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)工具。这套系统允许开发团队…...
深度解析jqktrader:基于Python的同花顺自动化交易架构设计与实战应用
深度解析jqktrader:基于Python的同花顺自动化交易架构设计与实战应用 【免费下载链接】jqktrader 同花顺自动程序化交易 项目地址: https://gitcode.com/gh_mirrors/jq/jqktrader 在量化交易技术快速发展的今天,传统手动交易已无法满足高频、精准…...
从GRACE gfc到可用数据:一个MATLAB脚本搞定CSR/GFZ/JPL三大机构数据预处理
GRACE数据处理实战:MATLAB自动化流水线构建指南 在气候变化和水文循环研究中,GRACE卫星数据已成为不可或缺的重要资源。面对CSR、GFZ和JPL三大机构发布的多样化数据格式,研究人员常常需要花费大量时间在数据预处理环节。本文将分享一套完整的…...
在Jetson Orin NX上为PyTorch 2.0编译TorchVision 0.15:一份完整的避坑与问题解决记录
在Jetson Orin NX上为PyTorch 2.0编译TorchVision 0.15:一份完整的避坑与问题解决记录 Jetson Orin NX作为英伟达新一代边缘计算设备,凭借其强大的AI算力和紧凑的尺寸,成为众多开发者的首选。然而,当我们需要在ARM架构上为特定版本…...
遥感小白看过来!无需编程5分钟搞定Landsat8数据下载(2023最新版)
零代码获取Landsat8遥感数据的完整指南(2023实战版) 当第一次接触遥感数据时,许多非技术背景的研究者常被复杂的下载流程吓退。其实,获取Landsat8卫星影像完全可以像网购一样简单——不需要编写任何代码,甚至不需要理解…...
2 轻量设备鸿蒙应用开发极简流程 | 鸿蒙开发筑基实战
轻量设备鸿蒙应用开发极简流程 | 鸿蒙开发筑基实战 作者:杨建宾(华夏之光永存) 摘要 本文面向鸿蒙轻量设备(HiSpark系列、穿戴设备、IoT终端)开发者,拆解从工程创建到上线的全流程。聚焦轻量设备硬件资源有…...
从package.xml到CMakeLists.txt:手把手教你配置一个ROS1机器人控制包(附完整项目模板)
从package.xml到CMakeLists.txt:构建工业级ROS1机器人控制包的完整指南 在机器人操作系统(ROS)开发中,功能包的配置质量直接影响项目的可维护性和扩展性。本文将带您深入理解ROS1功能包的核心配置文件,通过一个完整的工业机器人控制包案例&am…...
家长选择赶考状元AI学伴的五大理由:解锁学习新体验与核心好处
在AI技术蓬勃发展的今天,教育领域正经历一场深刻的变革。赶考状元AI学伴作为创新教育模式的代表,为孩子们带来了前所未有的学习新体验。越来越多的家长开始关注并选择这一系统,其背后的理由和好处值得深入探讨。本文将从行业角度,…...
保姆级教程:在Windows 10/11上快速搭建mosquitto MQTT服务器,并用MQTTX客户端测试(附常见错误解决)
Windows平台零门槛搭建MQTT开发环境:从Mosquitto配置到MQTTX实战 最近在调试ESP32温湿度传感器时,发现直接连接公有MQTT服务器总遇到网络延迟问题。于是决定在本地搭建一个轻量级MQTT Broker,没想到整个过程比预想的顺畅许多——从Mosquitto…...
Golang怎么用Task替代Makefile_Golang如何用go-task编写跨平台的任务脚本文件【教程】
go-task 是用 Go 编写的跨平台任务编排工具,本质区别于 Makefile:它用 YAML 定义任务、不依赖 shell 缩进、默认不继承父环境变量、无增量构建、支持变量注入与平台条件判断,且单文件分发。go-task 是什么,和 Makefile 有什么本质…...
从数据孤岛到智能决策中枢:一体化系统如何重构 HR 数据流
去年某制造企业 HR 总监跟我抱怨:员工入职要在招聘系统录一遍信息,转正时人事系统再录一遍,发工资时薪酬系统又要重新核对。三个系统互不相通,一个员工的完整档案要从三个地方拼凑。这不是个例,而是很多企业正在经历的…...
