javassist:增强型的java反射工具,获取方法参数名,获取方法参数标注值

java的反射是不能获取方法的参数名的。比如:

public  String concatString(String param1 ,String param2 ){
        
return  param1 + param2;
    }


想获取"param1",和"param2"这个参数名,貌似是不行的。借助第三方包javaassist 就可以获得。

 1        public   static   void  main(String[] args) {
 2           Class clazz  =  
 3   MyClass. class ;
 4            try  {
 5               ClassPool pool  =  ClassPool.getDefault();  
 6               CtClass cc  =  pool.get(clazz.getName());  
 7               CtMethod cm  =  cc.getDeclaredMethod( "concatString " );
 8               
 9                // 使用javaassist的反射方法获取方法的参数名
10               MethodInfo methodInfo  =  cm.getMethodInfo();  
11               CodeAttribute codeAttribute  =  methodInfo.getCodeAttribute();  
12               LocalVariableAttribute attr  =  (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);  
13                if  (attr  ==   null )  {
14                    // exception
15               }
16               String[] paramNames  =   new  String[cm.getParameterTypes().length];  
17                int  pos  =  Modifier.isStatic(cm.getModifiers())  ?   0  :  1 ;  
18                for  ( int  i  =   0 ; i  <  paramNames.length; i ++ )  
19                   paramNames[i]  =  attr.variableName(i  +  pos);      
20                // paramNames即参数名
21                for  ( int  i  =   0 ; i  <  paramNames.length; i ++ ) {
22                   System.out.println(paramNames[i]);
23               }
24               
25           }  catch  (NotFoundException e) {
26               e.printStackTrace();
27           } 
28       }



第一次使用觉得这个东西蛮神奇的。今天我在用反射获取标注值时,发现使用jdk本身的反射貌似也获取不到。我又想到了javassist,他果然没让我失望。

 1        public  String datefomat(@DateFormat( " yyyy-MM-dd HH " )Date date1){
 2            return  date1.toString();
 3       }
 4       
 5        public   static   void  main(String[] args) {
 6           Class clazz  = MyClass. class ;
 7            try  {
 8                // 使用jdk原生的反射方法
 9               Method m  =  clazz.getDeclaredMethod( " datefomat " ,  new  Class[]{Date. class });
10               Annotation[][] annotations  =  m.getParameterAnnotations();
11               System.out.println(annotations[ 0 ]);
12   //             Annotation anno = annotations[0][0];  //  index outof range  exception
13           }  catch  (SecurityException e) {
14               e.printStackTrace();
15           }  catch  (NoSuchMethodException e) {
16               e.printStackTrace();
17           }
18           
19            try  {
20               ClassPool pool  =  ClassPool.getDefault();  
21               CtClass cc  =  pool.get(clazz.getName());  
22               CtMethod cm  =  cc.getDeclaredMethod( " datefomat " );
23               
24                // 使用javassist的反射方法可以获得参数标注值
25               Object[][] annotations  =  cm.getParameterAnnotations();
26               DateFormat myAnno  = (DateFormat) annotations[ 0 ][ 0 ];
27               System.out.println(myAnno.value());
28               
29               
30               
31               
32           }  catch  (NotFoundException e) {
33               e.printStackTrace();
34           }  catch  (ClassNotFoundException e) {
35               e.printStackTrace();
36           }
37           
38           
39           
40       }


Annotation的定义:

 1   package  ;
 2  
 3   import  java.lang.annotation.ElementType;
 4   import  java.lang.annotation.Target;
 5  
 6   @Target(ElementType.PARAMETER)   
 7   public  @ interface  DateFormat {
 8       String value()  default   " yyyy-MM-dd " ;
 9   }
10
我估计:
getParameterAnnotations之所以没有获得到DateFormat 的实例,是因为DateFormat 的定义没有:
@Retention(RetentionPolicy.RUNTIME)
所以运行时不会获取Annotation对象
【字节码】使用Javassist在运行时重新加载类「替换 原方法输出不一样的结果」 实时加载类 关于热加载修改类的操作,在实际场景中还是蛮多的,但一般都是比较苛刻的场景诉求。在平时开发中还是比较少遇到的,并且CRUD开发不会遇到。Javassist 对 ASM 这样的字节码操作封装起来提供的 API 确实很好操作,在一些场景下也不需要考虑 JVM 中局部变量和操作数栈。但如果需要更高的性能,可以考虑使用 ASM。 阅读详情

相关推荐

机器学习第四个算法ANN(人工神经网络)

我是在14年9月刚读研的时候听到一个说法叫“类人脑算法”很火热,之后搞了很长一段时间相关的蓄水池算法等,但大都没有摸到门路而中途放弃了。现今看来,还是缺少一些知识背景,也不善于在网络上学习,随时间推移,也逐渐明白这是机器学习的一小部分,并且逐渐发展的名称叫做人工神经网络的算法,如果网络层较多,又会有个别名,叫做深度学习。其中个用到的最著名的算法是背向传输算法(backpropagation),而这个

legalhighhigh的博客 1万+

使用JavaAssist获取方法参数名

【代码】使用JavaAssist获取方法参数名。

focus-unchanged-thing 560

halcon 查找圆形

先找到大概位置进行拟合,然后再以拟合出的位置作为测量的大概位置进行找圆;

qq_59062726的博客 735

javaassist使用

之前使用到了Instrumentation来做字节码修改,用到了javaassist,顺便做个笔记,记录一下。 对于动态扩展现有类或接口的二进制字节码,有比较成熟的开源项目提供支持,如CGLib、ASM、Javassist等。其中,CGLib的底层基于ASM实现,是一个高效高性能的生成库;而ASM是一个轻量级的类库,但需要涉及到JVM的操作和指令;相比而言,Javassist要简单的多,完全是基于...

ZERO 2649

ESP32-CAM图像糊成马赛克?OV2640参数调优保姆级教程(亮度/对比度/饱和度)

本文提供了一份详细的ESP32-CAM图像调优教程,针对OV2640摄像头常见的图像模糊问题,从分辨率设置、亮度/对比度/饱和度调整到高级寄存器配置,帮助用户优化网页显示画质。通过代码示例和实用技巧,解决马赛克、色彩暗淡等问题,提升摄像头性能。

weixin_30410119的博客 598

第二十七届华东杯数学建模A 题 跳台滑雪问题 完整思路模型及代码

考虑到滑行过程中的空气阻力和摩擦力对速度的影响,我们引入了不同姿态下运动员迎风面积和空气阻力系数的变化,利用牛顿第二定律建立加速度表达式,并通过数值模拟比较常见姿态下的终端速度。针对问题二,我们构建了二维空中飞行动力学模型,结合起跳速度、身体迎角、滑雪板倾角等因素,模拟运动员在空中飞行的轨迹与姿态变化,采用欧拉法对运动过程进行仿真,优化飞行路径和稳定性。仿真结果表明,运动员应在起跳后保持滑雪板与身体成“V”字形打开、重心略后倾的姿态,以增强升力、延长飞行距离并提高姿态得分。,并模拟出跳跃的轨迹和最终得分。

lichensun的博客 3212

根据入参通过反射获取入参字段名及对应的值

public BaseApiReturnJson CommonMethod(Dto pDto){ Field[] fields = pDto.getClass().getDeclareFields(); try{ for( int i = 0 ; i &lt; fields.length() ; i++){ //根据入参循环取出对应类的属性名及值 ...

futao127的博客 2504

TestFlight分发测试app,提示无法安装 所请求的App不可用或者不存在

TestFlight分发测试app,提示无法安装 所请求的App不可用或者不存在

天穹云原生 9172

go反射获取func入参及其返回值类型

go反射获取func入参及其返回值类型

Go的全部 2100

YOLOv9改进策略目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好本专栏自开设两个月以来已经更新改进教程50余篇其中包含RepNCSPELAN4、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。同时本人一些讲解视频和包含我所有创新的YOLOv9文档并不能在优快云上传(所有的创新点都经过我的测试是可用的,得到该文件之后大家可以随意组合使用),所以会建立群的形式在内上传我的文件和视频我也会在群内不定期和大家交流回答大家问题,同时定期会更新一些文章的创新点(经过我融合测试后的,先到先得)。

Snu77的博客 1万+

动量因子在A股市场的有效性分析:量化实证研究

验证动量因子在A股市场的有效性及时间周期性分析不同时间窗口(短期/中期/长期)对动量效应的影响量化交易成本、市场流动性对动量策略收益的侵蚀程度比较A股与成熟市场(如美股)动量效应的差异特征理论框架:行为金融学解释动量效应的产生机制技术实现:Python全流程代码实现动量因子计算与回测实证分析:统计检验、风险收益指标、敏感性分析应用拓展:结合市场微观结构的策略优化方案动量因子(Momentum Factor)

2501_92132293的博客 2490

java 反射

参考资料: Java反射技术详解_黄林晴的博客-优快云博客_java反射 Java高级篇(四)——反射 - JAdam - 博客园 一、什么是反射   反射就是把Java类中的各个成分映射成一个个的Java对象。 即在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用它的任意一个方法和属性。 这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。 1. 反射机制的功能   Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属

喵酱 2851

2026年AI视频生成大模型全景指南:国内外主流工具深度对比与选型建议

AI视频生成技术在2025年至2026年间取得了突破性进展,从"能用"进化到"好用",商业化应用加速落地。中美双轨竞争格局基本成型,国内模型在技术追赶和本土化体验方面展现出强劲竞争力。对于用户而言,选择合适的AI视频生成工具需要综合考虑技术性能、使用门槛、成本预算和具体需求。零基础新手推荐海艺AI、通义万相等低门槛工具;进阶创作者可根据需求选择可灵AI、即梦AI、海艺AI等;专业开发者和企业用户可考虑智谱清影的开源能力或可灵AI的商业化服务。

nmdbbzcl的博客 2849

javaassist获取方法跟注解,以及获取类注解 annotations总结

如何通过javaassist 获取类就不细写,假设我们

1602

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Method.getParameterAnnotations()研究

在Java的反射中,通常需要获取方法参数上的注解,那么: 1,先拿到对象的Class对象. 2,然后找到某个方法的反射对象Method 3,然后再用Method的获取参数注解. Annotation[][] annos = method.getParameterAnnotations(); 得到的结果是一个二维数组. 那么这个二维数组是怎么排列组合的呢? 首先举个例子

有志者一定行 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

字节码编程javassist之获取方法参数类型,参数值列表,返回值等

本文看下如何获取方法参数名称,参数值,返回值等。

wang0907的博客 654

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

基于javassist技术和RequestMappingHandlerMapping实现自定义|动态注册spring mvc HandlerMapping的迭代记录...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34187822的博客 632

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

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

qq_42553504的博客 4107

Javassist: Java Bytecode Engineering Made Simple

 翻译:ithuriel xiaoSummaryJavassist是一个执行字节码操作的强而有力的驱动代码库。它允许开发者自由的在一个已经编译好的类中添加新的方法,或者是修改已有的方法。但是,和其他的类似库不同的是,Javassist并不要求开发者对字节码方面具有多么深入的了解,同样的,它也允许开发者忽略被修改的类本身的细节和结构。字节码驱动通常被用来执行对于已经编译好的类的修改,或者

allan1031的专栏 1015

java 反射及反射替代,有你想看的

文章目录什么是反射反射能干什么实现反射的几种方式反射的实现反射的缺点优点:缺点:需要考虑反射的慢吗有什么方法可以替代反射吗javassit生成代码BCELASM其他框架应该选哪个呢扩展字面常量不会触发初始化 什么是反射 反射就是在程序运行期间,动态的获取一个类的Class对象,然后通过Class对象来解析类的结构,比如说得到这个类有什么方法,有什么属性。得到这些方法或属性后,可以调用指定对象上的这个方法,也可以给指定对象上的这个属性赋值。 一个类都有什么东西:成员变量、方法、构造方法、注解等信息,利用反射技

qq_16607641的博客 2504

javassist:增强型的java反射工具,获取方法参数名

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33738555的博客 167

Javassist 使用指南

说明:翻译的太好,怕原文丢失就转载了。 1. 读写字节码 我们知道 Java 字节码以二进制的形式存储在 class 文件中,每一个 class 文件包含一个 Java 类或接口。Javaassist 就是一个用来处理 Java 字节码的类库。 在 Javassist 中,类 Javaassit.CtClass 表示 class 文件。一个 GtClass (编译时类)对象可以处理一个 cl...

深度Java 9990

【Javassist】快速入门系列02 使用Javassist实现方法执行时间统计

上一章我们介绍了使用Javassist实现一个简单的Hello World程序,学会了Javassist创建类和新增方法。本章主要介绍如何使用Javassist实现一个无侵入的方法执行时间统计本篇文章介绍了使用Javassist实现方法执行时间统计,同时学习了使用Javassist在方法体的开头/结尾插入代码和为类添加字段。Javassist可以在无侵入的前提下在方法体前后加入内容,非常的方便。

Vaxue的博客 724
上一篇: 在struts1.2中使用拦截器
下一篇: 用Bouncy Castle实现AES-128-CBC加密解密
programloverjack
博客等级 码龄17年 5粉丝 252原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值