概述
java的反射是不能获取方法的参数名的。比如:
publicStringconcatString(String
param1,String
param2){
returnparam1+param2;
}
returnparam1+param2;
}
想获取"param1",和"param2"这个参数名,貌似是不行的。借助第三方包javaassist就可以获得。
整合原作者代码:
- importjavassist.ClassPool;
- importjavassist.CtClass;
- importjavassist.CtMethod;
- importjavassist.Modifier;
- importjavassist.NotFoundException;
- importjavassist.bytecode.CodeAttribute;
- importjavassist.bytecode.LocalVariableAttribute;
- importjavassist.bytecode.MethodInfo;
- publicclassTest{
- publicstaticvoidmain(String[]args){
- testReflectParamName();
- }
- /**
- *反射获取方法参数名称
- */
- publicstaticvoidtestReflectParamName(){
- Classclazz=MyClass.class;
- try{
- ClassPoolpool=ClassPool.getDefault();
- CtClasscc=pool.get(clazz.getName());
- CtMethodcm=cc.getDeclaredMethod("concatString");
- //使用javaassist的反射方法获取方法的参数名
- MethodInfomethodInfo=cm.getMethodInfo();
- CodeAttributecodeAttribute=methodInfo.getCodeAttribute();
- LocalVariableAttributeattr=(LocalVariableAttribute)codeAttribute
- .getAttribute(LocalVariableAttribute.tag);
- if(attr==null){
- //exception
- }
- String[]paramNames=newString[cm.getParameterTypes().length];
- intpos=Modifier.isStatic(cm.getModifiers())?0:1;
- for(inti=0;i<paramNames.length;i++)
- paramNames[i]=attr.variableName(i+pos);
- //paramNames即参数名
- for(inti=0;i<paramNames.length;i++){
- System.out.println("参数名"+i+":"+paramNames[i]);
- }
- }catch(NotFoundExceptione){
- e.printStackTrace();
- }
- }
- }
- classMyClass{
- publicStringconcatString(Stringparam1,Stringparam2){
- returnparam1+param2;
- }
- }
反射获取参数注解:
- importjava.lang.annotation.Annotation;
- importjava.lang.annotation.ElementType;
- importjava.lang.annotation.Retention;
- importjava.lang.annotation.RetentionPolicy;
- importjava.lang.annotation.Target;
- importjava.lang.reflect.Method;
- importjava.util.Date;
- importjavassist.ClassPool;
- importjavassist.CtClass;
- importjavassist.CtMethod;
- importjavassist.Modifier;
- importjavassist.NotFoundException;
- importjavassist.bytecode.CodeAttribute;
- importjavassist.bytecode.LocalVariableAttribute;
- importjavassist.bytecode.MethodInfo;
- publicclassTest{
- publicstaticvoidmain(String[]args){
- testReflectParamName();
- //反射获取方法参数注解
- testReflectMethodParamAnno();
- }
- /**
- *反射获取方法参数名称
- */
- publicstaticvoidtestReflectParamName(){
- Classclazz=MyClass.class;
- try{
- ClassPoolpool=ClassPool.getDefault();
- CtClasscc=pool.get(clazz.getName());
- CtMethodcm=cc.getDeclaredMethod("concatString");
- //使用javaassist的反射方法获取方法的参数名
- MethodInfomethodInfo=cm.getMethodInfo();
- CodeAttributecodeAttribute=methodInfo.getCodeAttribute();
- LocalVariableAttributeattr=(LocalVariableAttribute)codeAttribute
- .getAttribute(LocalVariableAttribute.tag);
- if(attr==null){
- //exception
- }
- String[]paramNames=newString[cm.getParameterTypes().length];
- intpos=Modifier.isStatic(cm.getModifiers())?0:1;
- for(inti=0;i<paramNames.length;i++)
- paramNames[i]=attr.variableName(i+pos);
- //paramNames即参数名
- for(inti=0;i<paramNames.length;i++){
- System.out.println("参数名"+i+":"+paramNames[i]);
- }
- }catch(NotFoundExceptione){
- e.printStackTrace();
- }
- }
- /**
- *反射获取方法参数注解
- */
- publicstaticvoidtestReflectMethodParamAnno(){
- Classclazz=MyClass.class;
- try{
- //使用jdk原生的反射方法
- Methodm=clazz.getDeclaredMethod("datefomat",
- newClass[]{Date.class});
- Annotation[][]annotations=m.getParameterAnnotations();
- System.out.println("jdk获取方法参数anno:"+annotations[0][0]);
- }catch(SecurityExceptione){
- e.printStackTrace();
- }catch(NoSuchMethodExceptione){
- e.printStackTrace();
- }
- try{
- ClassPoolpool=ClassPool.getDefault();
- CtClasscc=pool.get(clazz.getName());
- CtMethodcm=cc.getDeclaredMethod("datefomat");
- //使用javassist的反射方法可以获得参数标注值
- Object[][]annotations=cm.getParameterAnnotations();
- DateFormatmyAnno=(DateFormat)annotations[0][0];
- System.out.println("参数注解:"+myAnno.value());
- }catch(NotFoundExceptione){
- e.printStackTrace();
- }catch(ClassNotFoundExceptione){
- e.printStackTrace();
- }
- }
- }
- classMyClass{
- publicStringconcatString(Stringparam1,Stringparam2){
- returnparam1+param2;
- }
- publicStringdatefomat(@DateFormat("yyyy-MM-ddHH")
- Datedate1){
- returndate1.toString();
- }
- }
- //注解类
- @Target(ElementType.PARAMETER)
- @Retention(RetentionPolicy.RUNTIME)
- @interfaceDateFormat{
- Stringvalue()default"yyyy-MM-dd";
- }
最后
以上就是害羞犀牛为你收集整理的javassist:增强型的java反射工具,获取方法参数名的全部内容,希望文章能够帮你解决javassist:增强型的java反射工具,获取方法参数名所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复