Javassist给方法添加形参,给方法添加参数

前言:

此次用到的jar包 Javassist 此篇博文不是教大家怎么去了解他,因为我也不是很了解

主要是因为这两天有一个需求是扩展knife4j 需要用到大量反射了解到的。

因为这方面资料太少了。我也是慢慢摸索出来的。把这些发出来吧。

我理解的 Javassist 主要是对字节码方面的一些操作。

因为我需要在不修改源码的情况下,动态扩展字节码,然后将字节码加载到springIoc容器中。

我主要用到了,

给类添加注解

给方法添加注解

给注解添加属性

将接口转为类

给方法添加方法体

添加无参构造

添加有参构造

给接口添加参数

其实看起来不多。着实的采了一堆坑,我分开发吧,每个不同的功能分开发

原生测试类

里面啥都没有,我主要是要给方法添加形参。

添加形参之后的方法,class

代码:

      //获取类池ClassPool classPool = ClassPool.getDefault();CtClass ctClass = null;try {//获取类 全类名ctClass = classPool.getCtClass("aa.bb.cc.AAAA");//获取方法 根据普通反射获取CtMethod method = ctClass.getDeclaredMethod("aaa");//给方法添加形参 :其实这里看起来就两段话,但是采了不少坑CtClass ctClass1 = classPool.get(String.class.getName());method.addParameter(ctClass1);//通过类加载器加载该CtClassctClass.toClass();//根据CtClass生成 .class 文件 我指定生成在当前目录下,方面看class编译后的内容ctClass.writeFile("D:\\develop\\peojiect\\springboot_demo\\silence-spring-auto\\src\\main\\java");} catch (Exception e) {e.printStackTrace();}

pom

        <dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.28.0-GA</version></dependency>

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

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

相关文章

javassist动态给方法添加注解,动态给形参添加注解,动态给类添加注解

参考文档 这个写的挺全的&#xff0c;就是写的有点丑 javassist教程_不懂人情世故的博客-CSDN博客_java javassist转载 https://www.cnblogs.com/rickiyang/p/11336268.htmljavassist使用全解析Java 字节码以二进制的形式存储在 .class 文件中&#xff0c;每一个 .class 文件包…

解决javassist不能重复加载字节码的问题

因为我的是一个接口&#xff0c;所以麻烦诸多。 事实上在类加载前做好准备工作&#xff0c;不会遇到这个问题&#xff0c;但是我正巧&#xff0c;在使用javassist的时候需要加载类&#xff0c;因为我要读取源码&#xff0c;拿到注释&#xff0c;再通过ssit 修改字节码&#xf…

根据type类型判断是否为基本数据类型,或基本数据类型的包装类,或泛型为基本数据类型

根据type类型判断是否为基本数据类型&#xff0c;或基本数据类型的包装类&#xff0c;或泛型为基本数据类型 /*** 判断是否为基本数据类型&#xff0c;或基本数据类型的包装类&#xff0c;或泛型为基本数据类型* string true* int true* Integer true* String[] true* user[] …

根据参数类型,获取泛型里所有的引用clazz,获取泛型实际参数

/*** 根据参数类型&#xff0c;获取泛型里所有的引用clazz* 列&#xff1a; public List<PageResult<List<User>>> intTest(RequestEntity<Map<String, List<PageResult<User>>>> req)** aClass class org.springframework.http.Re…

根据class判断是否为基本数据类型,或基本数据类型的包装类,或基本类型的数组,不考虑泛型

/*** 判断是否为基本数据类型&#xff0c;或基本数据类型的包装类&#xff0c;不考虑泛型* string true* int true* Integer true* String[] true* user[] false* List<string> false* list<user> false*/private static boolean isPrimitive(Class<?> cl…

反射根据类型,提取引用类型clazz

根据反射&#xff0c;提取引用类型&#xff0c;不包含基本数据类型&#xff0c;以及基本数据类型的包装类&#xff0c;及单列集合&#xff0c;和双列集合 /*** 是否为引用数据类型*/private static boolean isPrimitive(Class<?> clazz) {if (clazz.equals(String.class…

通过反射遍历属性,找出基本数据类型,和自定义引用类,以便生成接口文档时使用

/*** 是否为一个用户标准bean&#xff0c;不考虑泛型情况*/private static boolean isBean(Class<?> clazz) {if (clazz.equals(String.class) || ClassUtil.isBasicType(clazz)) {return false;}if (clazz.isArray() && ClassUtil.isSimpleValueType(clazz.get…

通过反射还原实际参数类型

/*** 根据类型提取所有关联参数*/public static void getAllParameter(Type type, List<Class<?>> list) {Class<?> c1 TypeUtil.getClass(type);if (type instanceof ParameterizedType) {Type[] ts ((ParameterizedType) type).getActualTypeArguments…

通过反射复原完整的src方法名称

/*** 根据方法名&#xff0c;生成完整的方法行** param clazz 字节码* param method java.lang.reflect method* return public static Annotation getAnnotation(Class<?> clazz, ConstPool constPool);*/public static String getSrcMethod(Class<?> clazz, M…

js关闭iframe窗口_[Selenium]24.处理弹窗新式的模态窗口

场景页面上弹出的对话框是自动化测试经常会遇到的一个问题。很多情况下这个弹出的对话框是一个iframe&#xff0c;处理起来有点麻烦&#xff0c;需要进行switch_to操作. 请参考文章测试曾哥&#xff1a;[Selenium]23.对话框的处理​zhuanlan.zhihu.com但现在很多前端框架的对话…

android 暂停其他app的声音_【一万个APP】第二十二期潮汐

基本信息分类:健康健美版本:Android-2.5.3 IOS-2.5.2更新时间:Android:2019.02.26 IOS:2019.03.06IOS评分(N/H):4.9/4.9开发商: 广州多少网络科技有限公司官方网站: https://tide.moreless.io/Android下载量:13,960,000IOS同类排名:52体验版本: Android-2.5.3PS&#xff1a;最近…

c语言判断字符串是不是回文_LeetCode 热题 HOT 100 5. 最长回文子串

题目题解暴力法我们根据回文字符串特点进行判断一个字符串是不是回文。// 回文子串&#xff1a;首尾对称相等const isPalindrome s > { // abba aba for (let i 0; i < Math.floor(s.length / 2); i) { if (s[i] ! s[s.length - 1 - i]) { ret…

random list随机生成不重复数

有一个需求&#xff0c;需要随机生成六位数&#xff0c;从100001 ---999999但是又要不重复&#xff0c;且不影响性能。如果每次生成都去判断是否重复&#xff0c;当生成的次数足够多&#xff0c;会影响性能。我想的是开一条线程&#xff0c;提前去处理。 提前生成好随机的数。直…

django 默认查询条件_Python之Django系列-创建第一个应用-4

上一篇&#xff1a;Python之Django系列-创建第一个应用-3 上一篇文章我们介绍了创建项目&#xff0c;打开浏览器访问http://127.0.0.1:8000/polls/&#xff0c;能看见"投票主页视图"等描述。本篇文章我们接着上一篇文章继续学习&#xff0c;在Python之Django系列-初始…

Exception in thread “main“ java.lang.IllegalArgumentException: Illegal Capacity: -1

创建list集合下标超出。 模拟场景 我是由于创建list &#xff0c;大小的时候&#xff0c;写反了

三相同步电机怎么接线图_智能电表怎么接线 单相 三相电表接线图大全

电表分为单相电表和三相电表&#xff0c;接线方法又为直入式和互感式&#xff0c;现在我们分电表种类和接线方法&#xff0c;来讲解电表接线。单相电表直入式接线方法&#xff1a;家用单相电表的接线必须是左火L&#xff0c;右零N&#xff0c;左边火线进&#xff0c;火线出&…

window navicat连接阿里云服务器mysql步骤及常见问题

先登录自己的阿里云服务器 这有两个比较重要的&#xff0c;一个是配置出口端口&#xff0c; 还有一个就是拿到自己的公网ip 连接上服务器 我用的是finalshell 工具连接。 主要是基于docker安装mysql &#xff0c;现在我的服务器docker已经安装了&#xff0c;安装也很简单。网…

docker安装mysql并使用navicat连接

创建映射目录&#xff0c;我安装在用户目录下 mkdir ~/mysql mkdir ~/mysql/conf mkdir ~/mysql/logs mkdir ~/mysql/data 分别执行以上命令&#xff0c;创建文件目录 #启动 docker run -id \ -p 3306:3306 \ --namemysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/lo…

linux centos7下载安装zlib

安装nginx 缺少zlib依赖&#xff0c;由于各种环境无法拉取yum安装&#xff0c; yum安装 yum install -y zlib zlib-devel 手动安装 zlib 版本预览 Index of /fossilshttp://www.zlib.net/fossils/ 解压 tar -zxvf zlib-1.2.8.tar.gz 进入加压后的文件 cd zlib-1.2.8 执行…

idea 升级到2020后 无法启动_升级iOS 14尝鲜后,无法降级 iOS13.5.1?

北京时间6月23日凌晨1点&#xff0c;苹果在线上举行了WWDC 2020全球开发者大会。给我们正式带来了iOS 14&#xff0c;并且在凌晨3点半时的时候&#xff0c;苹果发布 iOS 14 beta 内测版系统&#xff0c;并提供内测升级方法&#xff0c;随后很多用户已经升级体验。但是尝鲜之后&…