- 浏览: 269311 次
- 性别:
- 来自: 新乡
文章分类
- 全部博客 (227)
- servciemix (10)
- db (18)
- javaTools (4)
- hibernate (31)
- web (3)
- spring (14)
- design pattern (4)
- java security (3)
- portal (1)
- ejb (6)
- session (2)
- java_lang (21)
- jbpm (29)
- struts (7)
- orgRights (2)
- project manager Jira (7)
- 跨库事务 (2)
- mysql (14)
- ubuntu (7)
- osgi (9)
- maven ant make (4)
- 分布式 高并发 高性能 (5)
- virgo-dm_server (0)
- osgi web (3)
- platform (1)
- smooks (1)
- business (1)
- 职场生涯 (14)
- Java编码格式 (2)
- web服务 (1)
- 计算机使用 (1)
- 健康工作生活的保障,工作中务必抛掉的不良心态 (4)
- 电信-网络监控 (1)
- 多线程-multithread (1)
- 海量数据-高性能 (2)
- Mybatis (1)
- web开发平台研发 (0)
- oracle (0)
- 应用服务器调优 (0)
- web前端 (0)
- servlet-jsp (0)
- tomcat (2)
- newtouch (1)
- portal_liferay (2)
- version control (1)
- apm-impact (2)
- tools (1)
- 研发管理 (1)
- 电商业务 (1)
- 生鲜电商市场调查 (0)
- PBX (0)
- 房东 (0)
最新评论
-
lifuchao:
...
权限问题 -
Branding:
谢谢,受教了,另外,CONN AS SYSDBA,必须是在操作 ...
Oracle密码忘记了怎么办? -
zhuchao_ko:
...
Portal实现原理 -
败类斯文:
不知道改哪里。。。木有见到红色。。表示悟性低了、、
jira error: Neither the JAVA_HOME nor the JRE_HOME environment variable is defin -
c__06:
正文:假如事务我是这样定义的: <tx:method n ...
Spring中Transactional配置
*
关于Java反射机制的一个实例
* http://developer.51cto.com 2009-06-19 13:59 abruzzi javaeye 我要评论(0)
本文向您展示Java反射机制的一个实例,该实例持简单EL的taglib,基本上实现了多级bean的属性的访问。
JSP的规范中,有个表达式语言(Expression Language, 简称EL),可以算是一个微型的语言,其中对request, page, session, application中预存的JavaBean对象的引用方式很是简单。最近正好需要写一个支持简单EL的taglib,所以就研究了下Java反射机制,目前基本上实现了多级bean的属性的访问,经测试,还是可以用的。如:
1. public static void main(String[] args){
2. UserBean bean = new UserBean();
3. bean.setName("John Abruzzi");
4. bean.setNick("Abruzzi");
5. bean.setAge(24);
6.
7. AddressBean addr = new AddressBean();
8. addr.setZip("0086");
9. addr.setStreet("Bell Street #12");
10. bean.setAddress(addr);
11.
12. System.out.println(BeanParser.doParse(bean, "bean.address.street"));
13. System.out.println(BeanParser.doParse(bean, "bean.address.zip"));
14. System.out.println(BeanParser.doParse(bean, "bean.name"));
15. System.out.println(BeanParser.doParse(bean, "bean.nick"));
16. System.out.println(BeanParser.doParse(bean, "bean.age"));
17. }
需要可以输出:
1. Bell Street #12
2. 0086
3. John Abruzzi
4. Abruzzi
5. 24
反射,即由一个抽象的对象(如Object),取出这个具体对象的属性或者方法(就EL中关于Bean的引用来说,这个定义已经够了)。在EL中,对一个Bean的某字段进行引用,只需 ${bean.field},当然,这个bean是已经被set到容器中的,这就是Java反射机制。
我们从容器中取出以bean为名字的Object,通过Java反射机制知道它的真实类型,然后通过field以javabean规范拼出方法名,进行调用,如果这个表达式是多级的,如${bean.field.field},其中第一个field本身就是一个bean对象,同样需要递归的进行解析。
大概原理就是这些了,看代码吧:
现有一个UserBean, 其中的一个字段Address本身又是一个AddressBean。
1. package elparser;
2.
3. public class AddressBean {
4. private String street;
5. private String zip;
6.
7. public String getZip() {
8. return zip;
9. }
10.
11. public void setZip(String zip) {
12. this.zip = zip;
13. }
14.
15. public String getStreet() {
16. return street;
17. }
18.
19. public void setStreet(String street) {
20. this.street = street;
21. }
22.
23. }
然后是UserBean
1. package elparser;
2.
3. public class UserBean {
4. private String name;
5. private String nick;
6. private AddressBean address;
7. private int age;
8.
9. public int getAge(){
10. return this.age;
11. }
12.
13. public void setAge(int age){
14. this.age = age;
15. }
16.
17. public String getName() {
18. return name;
19. }
20. public void setName(String name) {
21. this.name = name;
22. }
23. public String getNick() {
24. return nick;
25. }
26. public void setNick(String nick) {
27. this.nick = nick;
28. }
29. public AddressBean getAddress() {
30. return address;
31. }
32. public void setAddress(AddressBean address) {
33. this.address = address;
34. }
35. }
Bean都是很简单的,考虑到对基本类型的支持,所以在UserBean中加入一个int型的字段age
好了,看看怎么通过一个串和一个对象来取出其中的字段来:
1. package elparser;
2.
3. import java.lang.reflect.Method;
4.
5. public class BeanParser {
6.
7. private static String getMethodName(String property, String prefix){
8. String prop = Character.toUpperCase(property.charAt(0))+property.substring(1);
9.
10. String methodName = prefix + prop;
11.
12. return methodName;
13. }
14.
15. private static Object parse(Object bean, String expr){
16. Class beanClass = bean.getClass();
17.
18. Method method = null;
19. Object result = null;
20.
21. try{
22. //这两步是关键,get方法不需要传入参数,所以只是new出两个空数组传入
23. method = beanClass.getMethod(getMethodName(expr, "get"), new Class[]{});
24. result = method.invoke(bean, new Object[]{});
25. }catch(Exception e){
26. System.out.println(e.getMessage());
27. }
28.
29. return result;
30. }
31.
32. public static Object doParse(Object bean, String expr){
33. String keys[] = expr.split("\\.");
34.
35. Object obj = null;
36.
37. for(int i = 1; i < keys.length;i++){
38. obj = parse(bean, keys[i]);
39. bean = obj;
40. }//递归parse
41.
42. return obj;
43. }
44.
45. public static void main(String[] args){
46. UserBean bean = new UserBean();
47. bean.setName("John Abruzzi");
48. bean.setNick("Abruzzi");
49. bean.setAge(24);
50.
51. AddressBean addr = new AddressBean();
52. addr.setZip("0086");
53. addr.setStreet("Bell Street #12");
54. bean.setAddress(addr);
55.
56. System.out.println(BeanParser.doParse(bean, "bean.address.street"));
57. System.out.println(BeanParser.doParse(bean, "bean.address.zip"));
58. System.out.println(BeanParser.doParse(bean, "bean.name"));
59. System.out.println(BeanParser.doParse(bean, "bean.nick"));
60. System.out.println(BeanParser.doParse(bean, "bean.age"));
61. }
62. }
代码比较简短,重要部分有注释,应该很容易理解。当然这篇文章主要是关于Java的反射机制,如果需要对EL完全支持,可以使用JavaCC做一个简单的分析器(Apache的commons中包含一个el的项目,就是用javacc写的分析器)。
【编辑推荐】
1. 在Java应用程序中使用Jfreechart配置
2. Java程序员学习Flex和BlazeDS的十三个理由
3. 用JavaFX编写用户界面控制器
4. Java WEB开发中的中文乱码问题解决
5. 总结Java Web中几个函数的作用
【责任编辑:red7 TEL:(010)68476606】
关于Java反射机制的一个实例
* http://developer.51cto.com 2009-06-19 13:59 abruzzi javaeye 我要评论(0)
本文向您展示Java反射机制的一个实例,该实例持简单EL的taglib,基本上实现了多级bean的属性的访问。
JSP的规范中,有个表达式语言(Expression Language, 简称EL),可以算是一个微型的语言,其中对request, page, session, application中预存的JavaBean对象的引用方式很是简单。最近正好需要写一个支持简单EL的taglib,所以就研究了下Java反射机制,目前基本上实现了多级bean的属性的访问,经测试,还是可以用的。如:
1. public static void main(String[] args){
2. UserBean bean = new UserBean();
3. bean.setName("John Abruzzi");
4. bean.setNick("Abruzzi");
5. bean.setAge(24);
6.
7. AddressBean addr = new AddressBean();
8. addr.setZip("0086");
9. addr.setStreet("Bell Street #12");
10. bean.setAddress(addr);
11.
12. System.out.println(BeanParser.doParse(bean, "bean.address.street"));
13. System.out.println(BeanParser.doParse(bean, "bean.address.zip"));
14. System.out.println(BeanParser.doParse(bean, "bean.name"));
15. System.out.println(BeanParser.doParse(bean, "bean.nick"));
16. System.out.println(BeanParser.doParse(bean, "bean.age"));
17. }
需要可以输出:
1. Bell Street #12
2. 0086
3. John Abruzzi
4. Abruzzi
5. 24
反射,即由一个抽象的对象(如Object),取出这个具体对象的属性或者方法(就EL中关于Bean的引用来说,这个定义已经够了)。在EL中,对一个Bean的某字段进行引用,只需 ${bean.field},当然,这个bean是已经被set到容器中的,这就是Java反射机制。
我们从容器中取出以bean为名字的Object,通过Java反射机制知道它的真实类型,然后通过field以javabean规范拼出方法名,进行调用,如果这个表达式是多级的,如${bean.field.field},其中第一个field本身就是一个bean对象,同样需要递归的进行解析。
大概原理就是这些了,看代码吧:
现有一个UserBean, 其中的一个字段Address本身又是一个AddressBean。
1. package elparser;
2.
3. public class AddressBean {
4. private String street;
5. private String zip;
6.
7. public String getZip() {
8. return zip;
9. }
10.
11. public void setZip(String zip) {
12. this.zip = zip;
13. }
14.
15. public String getStreet() {
16. return street;
17. }
18.
19. public void setStreet(String street) {
20. this.street = street;
21. }
22.
23. }
然后是UserBean
1. package elparser;
2.
3. public class UserBean {
4. private String name;
5. private String nick;
6. private AddressBean address;
7. private int age;
8.
9. public int getAge(){
10. return this.age;
11. }
12.
13. public void setAge(int age){
14. this.age = age;
15. }
16.
17. public String getName() {
18. return name;
19. }
20. public void setName(String name) {
21. this.name = name;
22. }
23. public String getNick() {
24. return nick;
25. }
26. public void setNick(String nick) {
27. this.nick = nick;
28. }
29. public AddressBean getAddress() {
30. return address;
31. }
32. public void setAddress(AddressBean address) {
33. this.address = address;
34. }
35. }
Bean都是很简单的,考虑到对基本类型的支持,所以在UserBean中加入一个int型的字段age
好了,看看怎么通过一个串和一个对象来取出其中的字段来:
1. package elparser;
2.
3. import java.lang.reflect.Method;
4.
5. public class BeanParser {
6.
7. private static String getMethodName(String property, String prefix){
8. String prop = Character.toUpperCase(property.charAt(0))+property.substring(1);
9.
10. String methodName = prefix + prop;
11.
12. return methodName;
13. }
14.
15. private static Object parse(Object bean, String expr){
16. Class beanClass = bean.getClass();
17.
18. Method method = null;
19. Object result = null;
20.
21. try{
22. //这两步是关键,get方法不需要传入参数,所以只是new出两个空数组传入
23. method = beanClass.getMethod(getMethodName(expr, "get"), new Class[]{});
24. result = method.invoke(bean, new Object[]{});
25. }catch(Exception e){
26. System.out.println(e.getMessage());
27. }
28.
29. return result;
30. }
31.
32. public static Object doParse(Object bean, String expr){
33. String keys[] = expr.split("\\.");
34.
35. Object obj = null;
36.
37. for(int i = 1; i < keys.length;i++){
38. obj = parse(bean, keys[i]);
39. bean = obj;
40. }//递归parse
41.
42. return obj;
43. }
44.
45. public static void main(String[] args){
46. UserBean bean = new UserBean();
47. bean.setName("John Abruzzi");
48. bean.setNick("Abruzzi");
49. bean.setAge(24);
50.
51. AddressBean addr = new AddressBean();
52. addr.setZip("0086");
53. addr.setStreet("Bell Street #12");
54. bean.setAddress(addr);
55.
56. System.out.println(BeanParser.doParse(bean, "bean.address.street"));
57. System.out.println(BeanParser.doParse(bean, "bean.address.zip"));
58. System.out.println(BeanParser.doParse(bean, "bean.name"));
59. System.out.println(BeanParser.doParse(bean, "bean.nick"));
60. System.out.println(BeanParser.doParse(bean, "bean.age"));
61. }
62. }
代码比较简短,重要部分有注释,应该很容易理解。当然这篇文章主要是关于Java的反射机制,如果需要对EL完全支持,可以使用JavaCC做一个简单的分析器(Apache的commons中包含一个el的项目,就是用javacc写的分析器)。
【编辑推荐】
1. 在Java应用程序中使用Jfreechart配置
2. Java程序员学习Flex和BlazeDS的十三个理由
3. 用JavaFX编写用户界面控制器
4. Java WEB开发中的中文乱码问题解决
5. 总结Java Web中几个函数的作用
【责任编辑:red7 TEL:(010)68476606】
发表评论
-
Java程序员常用工具集
2012-05-23 14:30 985我发现很多人没办 ... -
基于JDBC的数据库连接池技术研究与设计
2011-12-16 14:34 772基于JDBC的数据库连接池技术研究与设计 摘 要 本文 ... -
关于jvm的设置
2011-12-16 10:38 1495一、Java heap space (一 ... -
JVM内存管理深入Java内存区域与OOM
2011-12-15 16:47 908JVM内存管理深入Java内存 ... -
JVM内存管理深入垃圾收集器与内存分配策略
2011-12-15 16:45 1134JVM内存管理深入垃圾收 ... -
jdbc 连接池小结
2011-12-15 16:43 893java基础面试题 主题:[我的工具箱] jXLS ... -
JVM参数调优
2011-12-15 14:35 817JVM参数调优是个很头痛 ... -
Java对象和JSON互转换利器-Gson
2011-11-04 17:22 1857Java对象和JSON互转换利器-Gson . 2008-07 ... -
java.lang.OutOfMemoryError: PermGen space及其解决方法
2011-10-26 17:52 812java.lang.OutOfMemoryError: Per ... -
java.sql.Date,java.sql.Time和java.sql.Timestamp
2011-09-06 14:11 1123java.sql.Date,java.sql.Time和jav ... -
java 编码
2011-07-21 19:13 1258w.write(new String("中文网&qu ... -
对泛型进行反射
2011-05-05 19:06 1222对泛型进行反射 今天在用反射的时候突然想到,之前从来没有对泛 ... -
Java反射经典实例 Java Reflection Cookbook
2011-05-05 19:05 770Java反射经典实例 Java Reflection Cook ... -
java 反射机制详解
2011-05-05 19:04 706java 反射机制详解 Java 的反射机制是使其具有动态特性 ... -
一次Java垃圾收集调优实战
2011-05-05 19:03 756一次Java垃圾收集调优实战 1 资料 * JDK5 ... -
利用反射和泛型让JDBC编程方便点
2011-05-05 19:02 830利用反射和泛型让JDBC编程方便点 一直以来使用JDBC编 ... -
利用反射取得泛型信息
2011-05-05 18:22 641利用反射取得泛型信息 一、传统通过反射取得函数的参数和返回值 ... -
深入剖析JAVA反射机制强大功能
2011-04-08 20:47 882* 深入剖 ... -
Java虚拟机内部构成浅析
2011-04-08 20:44 795* Java虚拟 ... -
详解reflect Java的反射机制
2011-04-08 20:42 531* 详解refle ...
相关推荐
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...
下面通过一个简单的示例来展示Java反射机制的工作流程: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0])...
Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用类的方法等。通过反射,程序可以动态地创建对象和调用...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这一机制对于理解和利用Java的动态性至关重要,尤其是在进行复杂系统设计、框架开发以及元数据驱动的应用中...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
Java 反射机制详解 Java 反射机制是 Java 语言提供的一种强大的工具,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并进行操作。这种能力使得 Java 应用程序更加灵活,能够在运行时发现和修改自身...
以下是对Java反射机制应用实例的详细解释: 1. **获取类信息**:使用`Class`类的`forName()`方法可以获取到任何类的`Class`对象,例如`Class<?> clazz = Class.forName("全限定类名");`。这样我们就能获取到该类的...
Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...
1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息
### Java反射机制总结 ...总之,Java反射机制是Java语言的一个重要特性,它提供了在运行时动态获取类信息和操作类结构的能力。合理使用反射可以提高程序的灵活性和扩展性,但在使用时也需要考虑到其潜在的问题和限制。
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个实例将深入探讨Java反射机制的使用,通过具体代码示例来阐述其工作原理和应用。 在Java中...
Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。...
通过上述实例,我们可以看到Java反射机制在许多实际场景中的应用,它扩展了Java代码的灵活性和可扩展性。然而,也应注意,过度使用反射可能会引入复杂性和潜在的安全风险,因此在设计和实现时需权衡利弊。在理解了...
Java反射机制允许程序在运行时获取关于类、接口、字段和方法的信息,并且能够动态地调用方法和修改字段值。这极大地增强了代码的灵活性和可扩展性。 2. **Class类**: 所有的Java类都隐式地继承自java.lang.Class...
5. **通过反射机制实例化一个类的对象**: ```java Object obj = clazz.newInstance(); ``` 6. **获取某个类的全部属性**: ```java Field[] fields = clazz.getDeclaredFields(); for (Field field : ...