- 浏览: 543146 次
- 性别:
- 来自: 湖南娄底
文章分类
- 全部博客 (252)
- C#资料 (0)
- java资料 (22)
- 数据库资料 (0)
- Java :开发中遇到的问题 (4)
- 书写属于我的人生 (6)
- spring (6)
- hibernate (16)
- struts (17)
- SSH (5)
- Linux操作系统 (1)
- Ext (5)
- Jquery (9)
- Tomcat部署出错 (2)
- xml (5)
- JSON (5)
- javascript 专题 (5)
- 开发环境配置 (2)
- web 开发 (27)
- Eclipse (7)
- Integration (1)
- 解决方案搜罗 (7)
- 网站收藏 (8)
- 测试框架 (1)
- iframe 专题 (6)
- JSTL (2)
- 各种插件收集 (2)
- 权限设计模型探讨 (1)
- DWR (1)
- log4j (3)
- java (11)
- java 格式化 (1)
- 软件工程 (2)
- 乱码专题 (1)
- UML (4)
- java 设计模式 篇 (1)
- 用法收集 (0)
- sourceforge apache solutions (2)
- Struts2 + JPA + Spring 开发 (1)
- 自定义工具箱 (0)
- IDE (4)
- opencms (1)
- jeecms (1)
- ant (0)
- maven (2)
- 数据库连接池 (0)
- spring MVC (0)
- android (1)
- web-server (1)
- iphone-开发环境 (1)
- iphone-软件开发 (6)
- iPhone-软件设计 (1)
- iphone-应用 (3)
- iPhone-设置 (2)
- iphone-软件开发-设计模式篇 (0)
- iphone-软件开发-OC基础 (9)
- iphone-软件开发- UI篇 (9)
- iphone-软件开发-工具类篇 (1)
- iphone-软件开发-第三方篇 (0)
- iphone-软件开发-特效篇 (2)
- iphone-软件开发-动画篇 (1)
- oracle (1)
- Java-Security (0)
- Three20 UI (1)
- IOS-HOW-TO-专题 (1)
- Mark-Develope Issues (1)
- iphone-软件开发- 资料参考篇 (1)
- C 语言-基本语法 (0)
- Java Servlet (2)
- Eclipse optimization (1)
- IOS Basic (0)
- ecl (0)
- FRONT-HTML (0)
- FRONT-JS (0)
- PHP (0)
最新评论
-
qq_29862421:
[[color=brown]color=yellow][url ...
java 上传图片同时获得图片的宽和高 -
hhb19900618:
NSString <==> NSNumber 之前 ...
OC 常用数据类型之间的转换 -
baohuan_love:
果然能解决问题,感谢分享
Tomcat Error Page配置 与 Error Page在IE下不能转发的问题 -
唐丽梅6313:
很细致。。
键盘样式风格有关设置-iOS开发 -
olived:
哥哥,为什么我的没有破解成功,总是提示许可文件丢失!!QQ:3 ...
[软件测试解决方案] soapUI 4.0.1破解方法
java的反射是不能获取方法的参数名的。比如:
public
String concatString(String param1
,String param2
){
return param1 + 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 }
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 }
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
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对象
@Retention(RetentionPolicy.RUNTIME)
所以运行时不会获取Annotation对象
发表评论
-
java 上传图片同时获得图片的宽和高
2012-02-01 19:00 4526java 上传图片同 ... -
Java实现的拦截器
2012-01-10 09:56 1304Java实现的拦截器 拦截 ... -
Tomcat 6中配置SSL双向认证
2012-01-09 20:58 0参考资料:http://wangking717.ite ... -
使用exe4j打包jar生成exe常用设置
2012-01-07 22:49 1085使用exe4j打包jar生成exe常用设置 ... -
字符串工具箱
2011-12-25 21:01 1018import java.io.File; import ja ... -
Java创建、重命名、删除文件和文件夹
2011-12-25 21:00 7074Java的文件操作太基础, ... -
JAVA 正则表达式
2011-12-03 22:37 795在Sun的Java JDK 1.40版本中 ... -
java 格式化字符串输出
2011-11-12 10:46 1295输出指定格式的字符串: Java代 ... -
java中实现换行的几种方法
2011-11-12 10:22 48241.使用java中的转义符"\r\n&quo ... -
java 访问修饰符
2011-11-06 12:04 834private package-private 只可以在同一 ... -
java集合框架
2011-10-12 08:10 865待续。。。 -
java中的io系统总结(转)
2011-10-09 09:02 948java中的io中的(input/outp ... -
属性文件的读写
2011-09-17 23:06 926附件中包含:属性文件的读写操作! -
quartz cronExpression详解<转载>
2011-08-18 20:14 1025quartz cronExpression详解 2009 ... -
java获取真实客户端ip地址 <转载>
2011-08-12 11:35 1917在JSP里,获取客户端的IP地址的方法是:request.ge ... -
java class.getResource()方法获取文件资源
2011-08-06 22:34 1571《转载》 用JAVA获取文件,听似简单,但对于很多像我这样的 ... -
求数组中最小的不重复的整数
2011-03-19 11:23 1003public class minNoRepeatNum{ ... -
WEB计时器的实现——Timer(转载)
2010-10-21 07:55 1719Java定时器(java.util.Timer)有定时触发计划 ... -
依赖注入的几种实现类型
2010-10-18 10:28 886Type1 接口注入 我们常 ... -
spring 中Pointcut的定义(转)
2010-10-18 09:47 1575在Spring 2.0中,Pointcut的定义包括两个部分 ...
相关推荐
Maven坐标:org.javassist:javassist:3.21.0-GA; 标签:javassist、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
Maven坐标:org.javassist:javassist:3.24.0-GA; 标签:javassist、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
Maven坐标:org.javassist:javassist:3.23.1-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...
Maven坐标:org.javassist:javassist:3.27.0-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...
开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发...
然而,标准的Java反射API并不直接提供获取方法参数名的功能。尽管可以获取到方法的其他元数据,如方法名、返回类型、参数类型等,但参数名在默认情况下并未包含在编译后的字节码中。这是因为参数名被视为调试信息,...
开源的分析、编辑和创建Java字节码的类库,加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。
赠送jar包:javassist-3.20.0-GA.jar; 赠送原API文档:javassist-3.20.0-GA-javadoc.jar; 赠送源代码:javassist-3.20.0-GA-sources.jar; 包含翻译后的API文档:javassist-3.20.0-GA-javadoc-API文档-中文...
总的来说,`javassist-3.18.1-GA.jar`是Javaassist库的一个稳定版本,提供了丰富的API和工具,用于在运行时操纵Java类的字节码。这对于理解和实现诸如Hibernate这样的高级框架的内部工作原理非常有帮助。通过阅读...
javassist-3.18.2-GA.jar
Maven坐标:org.javassist:javassist:3.18.1-GA; 标签:javassist、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
Maven坐标:org.javassist:javassist:3.19.0-GA; 标签:javassist、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
Java字节码工程工具包 千叶茂(Shigeru Chiba)版权所有(C)1999-2020,保留所有权利。 Javassist(JAVA编程ASSISTant)使Java字节码操作变得简单。 它是一个用Java编辑字节码的类库。 它使Java程序可以在运行时...
Maven坐标:org.javassist:javassist:3.23.1-GA; 标签:javassist、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
Java反编译工具JBoss Javassist是一款强大的Java字节码操作库,它允许程序员在运行时修改类或者创建新的类。Javassist是Java字节码操纵和分析框架,常用于动态代理、AOP(面向切面编程)以及逆向工程等场景。通过这...
Javaagent和javassist是Java开发中的两个重要工具,它们在软件开发中有着广泛的应用,特别是在动态代理、代码增强和字节码操作等领域。本篇将详细介绍这两个技术,并结合实际示例进行解析。 首先,让我们来了解`...
Maven坐标:org.javassist:javassist:3.24.0-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...
Maven坐标:org.javassist:javassist:3.18.1-GA; 标签:javassist、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中...
5. 测试工具:JUnit等测试框架利用反射调用私有方法或构造函数进行测试。 6. 反序列化:将序列化的对象数据反序列化为Java对象。 三、Java反射实例 1. 创建对象:通过`Class.newInstance()`创建默认构造器的对象,...
Maven坐标:org.javassist:javassist:3.21.0-GA; 标签:javassist、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...