ByteBuddy学习笔记

ByteBuddy

1.ByteBuddy的用途

ByteBuddy通过修改字节码来新增、修改、删除Java类的现有功能,主要用于分离功能代码和非功能代码,比如
功能代码部分
比如非功能代码如下:

public double calculatePrice(){double discount = getDiscount();double price = this.price + this.deliveryCharge - discount;return price;
}

添加比如打印日志等非功能代码,形成如下的内容:

public double calculatePrice(){long startTime = System.currentMilliseconds();logger.info("CalculatePrice start");double discount = getDiscount();double price = this.price + this.deliveryCharge - discount;logger.info("Method end");logger.info("CalculatePrice execution time: " + (System.currentMillioseconds() - startTime));return price;
}

2.ByteBuddy的初始化代码学习

首先在maven的dependencies标签之中配置上需要用到的库

        <dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy</artifactId><version>1.12.20</version></dependency><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy-agent</artifactId><version>1.12.20</version></dependency><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy-maven-plugin</artifactId><version>1.12.20</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>compile</scope></dependency>

然后学习示例的代码

    public void test() throws InstantiationException, IllegalAccessException {DynamicType.Unloaded unloadedType = new ByteBuddy()//创建ByteBuddy类型的一个实例.subclass(Object.class)//动态创建的类是继承Object的.method(ElementMatchers.isToString())//method为筛选器,筛选Object中的toString方法.intercept(FixedValue.value("Hello World ByteBuddy!"))//提供了toString()的实现,返回固定值"Hello World ByteBuddy!"//按照下面的最后定义函数优先,这里的类.make();//触发生成一个新的类Class<?> dynamicType = unloadedType.load(getClass().getClassLoader()).getLoaded();//把unloadedType实例加载到JVM之中,此时dynamicType相当于一个类Assertions.assertEquals(dynamicType.newInstance().toString(),"Hello World ByteBuddy!");//调用dynamicType.toString()方法不会生效,因为此时调用的是ByteBuddy.class的toString()方法}

3.ByteBuddy调用的优先级部分

    public void test() throws InstantiationException, IllegalAccessException {String r = new ByteBuddy().subclass(Foo.class).method(named("sayHelloFoo").and(isDeclaredBy(Foo.class)).and(returns(String.class)))//符合三个条件的方法.intercept(MethodDelegation.to(Bar.class)).make().load(getClass().getClassLoader()).getLoaded().newInstance().sayHelloFoo();assertEquals(r,Bar.sayHelloBar());}

intercept提供了类的实现,因为这里的intercept初始化的是Bar.class,而Bar和Foo的类中都有sayHelloBar这个方法,因此这里最终实现的是Bar的sayHelloBar方法

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式软件测试笔记10 | 嵌入式软件测试中如何进行安全性分析?

10 | 嵌入式软件测试中如何进行安全性分析&#xff1f; 1 简介2 故障模型及后果分析&#xff08;FMEA&#xff09;2.1 三个步骤2.2 带来的结果优势2.3 FMEA分析过程2.3.1 描述系统及其功能2.3.2 识别潜在的故障模式2.3.3 故障模式对功能的影响2.3.4 风险导致后果的原因2.3.5 风…

Django基础入门⑮:更新书籍信息 删除书籍条目信息 Django静态文件配置

Django基础入门⑮:更新书籍信息 删除书籍条目信息 Django静态文件配置 更新书籍信息删除书籍条目信息Django静态文件配置 &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Python领域新星创作者&#xff0c;CSDN实力新星认证&…

Spring源码系列-第2章-后置工厂处理器和Bean生命周期

第2章-后置工厂处理器和Bean生命周期 后置工厂处理器属于后置处理器&#xff0c;后置处理器是Spring最核心的部分&#xff0c;Spring几乎所有的附加功能全由它完成。 什么是BeanPostProcessor&#xff1f; public interface BeanPostProcessor {/*** Apply this {code BeanPos…

分布式监控系统之zabbix6.0二

分布式监控系统之zabbix6.0二 一、部署 zabbix 代理服务器二、部署 Zabbix 高可用集群三、Zabbix 监控 Windows 系统四、Zabbix 监控 java 应用五、Zabbix 监控 SNMP 一、部署 zabbix 代理服务器 分布式监控的作用&#xff1a; 分担 server 的集中式压力解决多机房之间的网络…

跨站脚本攻击XSS

​​​​​​1、漏洞原理及防御 XSS又叫CSS (CrossSiteScript),因为与层叠样式表(css)重名,所以叫Xss&#xff0c;中文名叫跨站脚本攻击。 xss攻击&#xff0c;主要就是攻击者通过“html注入”篡改了网页&#xff0c;插入了恶意的脚本&#xff0c;从而在用户浏览网页时&#…

火爆全网,自动化测试-Allure完美测试报告(详全)卷起来...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、allure简介 A…

java.lang.UnsatisfiedLinkError: Could not load SWT library.

java.lang.UnsatisfiedLinkError: Could not load SWT library. https://download.eclipse.org/windowbuilder/lastgoodbuild

【停用词】NLP中的停用词怎么获取?我整理了6种方法

文章目录 一、停用词介绍二、停用词应用场景2.1 提取高频词2.2 词云图 三、停用词获取方法3.1 自定义停用词3.2 用wordcloud调取停用词3.3 用nltk调取停用词3.3.1 nltk中文停用词3.3.2 nltk英文停用词 3.4 用sklearn调取停用词3.5 用gensim调取停用词3.6 用spacy调取停用词 一、…

亚马逊云科技为企业提供一站式的出海策略,为企业保驾护航

走出国门&#xff0c;寻找新的盈利空间、优化资源配置、实现创新突破&#xff0c;已经成为中国企业的战略共识。如何进行全球化布局、本地化运营&#xff0c;实现高质量出海&#xff0c;是出海企业共同面临的课题。在【潮向新世界】出海日活动上&#xff0c;亚马逊云科技分享了…

热爱python的第一天:初识python,搭建python环境,运行第一个python小程序

目录 1 初始python python 概述 python的应用领域 应用python的公司 2 搭建python 开发环境 2.1 安装python&#xff08;以windows 系统为例&#xff09;&#xff08;1&#xff09;下载安装包 &#xff08;2&#xff09; 下载保存后打开文件夹点击以管理员身份运行 &…

apt-get install命令

在Linux系统中&#xff0c;apt-get命令默认安装包的位置是在/usr目录下。具体来说&#xff0c;安装的可执行文件会存储在/usr/bin目录下&#xff0c;而库文件会存储在/usr/lib目录下。同时&#xff0c;相应的配置文件和文档等也会存储在/usr/share目录下。 举例&#xff0c;ap…

Rdkit|化学指纹(fingerprint)

github:地址 文章目录 Rdkit|化学指纹&#xff08;fingerprint&#xff09;化学指纹&#xff08;fingerprint&#xff09;RDKFingerprintMorgan指纹提供的指纹信息存储在字典中 MACCS指纹AtomPair指纹TopologicalTorsion指纹参考 Rdkit|化学指纹&#xff08;fingerprint&#x…