反射学习2-通过反射机制动态获取属性的值模拟Struts的自动赋值
2016-02-05 10:38
585 查看
一、准备知识:
Java反射机制
处理事务的JavaBean
String的操作常用方法
二、模拟步骤
这里我们通过反射机制动态获取属性的值模拟Struts中的自动赋值。
1、首先创建一个简单的User类包含两个属性username和userid以及getter、setter方法:
class User {
public
User(){}
private
String username;
private
String userid;
public
String getUserid() {
return userid;
}
public void
setUserid(String userid) {
this.userid = userid;
}
public
String getUsername() {
return username;
}
public void
setUsername(String username) {
this.username = username;
}
}
2、接下来创建User类的对象user1,然后通过反射机制动态把user1对象的所有属性赋值给新建的user2:
//创建user1对象
User user1 = new User();
user1.setUsername("arthinking");
user1.setUserid("001");
String username = "arthinking";
String userid = "001";
//通过user1对象获取Class
Class<?> classType =
user1.getClass();
//生成user2对象
Object user2 = classType.getConstructor(new
Class[]{}).newInstance(new Object[]{});
//从user1对应的Class对象中获取所有的属性
Field[] fields = classType.getDeclaredFields();
for(int i=0; i<fields.length; i++){
Field field
= fields[i];
//动态生成getter和setter方法
String
fieldName = field.getName();
String
firstChar = fieldName.substring(0,1).toUpperCase();
String
getterName = "get" + firstChar + fieldName.substring(1);
String
setterName = "set" + firstChar + fieldName.substring(1);
Method
getter = classType.getMethod(getterName);
Method
setter = classType.getMethod(setterName, new
Class[]{field.getType()});
//执行getter方法获取当前域的值
Object
result = getter.invoke(user1);
//执行setter给user2赋值
setter.invoke(user2, new Object[]{result});
}
Java反射机制
处理事务的JavaBean
String的操作常用方法
二、模拟步骤
这里我们通过反射机制动态获取属性的值模拟Struts中的自动赋值。
1、首先创建一个简单的User类包含两个属性username和userid以及getter、setter方法:
class User {
public
User(){}
private
String username;
private
String userid;
public
String getUserid() {
return userid;
}
public void
setUserid(String userid) {
this.userid = userid;
}
public
String getUsername() {
return username;
}
public void
setUsername(String username) {
this.username = username;
}
}
2、接下来创建User类的对象user1,然后通过反射机制动态把user1对象的所有属性赋值给新建的user2:
//创建user1对象
User user1 = new User();
user1.setUsername("arthinking");
user1.setUserid("001");
String username = "arthinking";
String userid = "001";
//通过user1对象获取Class
Class<?> classType =
user1.getClass();
//生成user2对象
Object user2 = classType.getConstructor(new
Class[]{}).newInstance(new Object[]{});
//从user1对应的Class对象中获取所有的属性
Field[] fields = classType.getDeclaredFields();
for(int i=0; i<fields.length; i++){
Field field
= fields[i];
//动态生成getter和setter方法
String
fieldName = field.getName();
String
firstChar = fieldName.substring(0,1).toUpperCase();
String
getterName = "get" + firstChar + fieldName.substring(1);
String
setterName = "set" + firstChar + fieldName.substring(1);
Method
getter = classType.getMethod(getterName);
Method
setter = classType.getMethod(setterName, new
Class[]{field.getType()});
//执行getter方法获取当前域的值
Object
result = getter.invoke(user1);
//执行setter给user2赋值
setter.invoke(user2, new Object[]{result});
}
相关文章推荐
- Spring4.0学习笔记009——AOP的配置(基于XML文件)
- Java获取客户端真实IP地址
- JAVA连接各种数据库详解
- Spring4.0学习笔记008——AOP的配置(基于注解)
- Java注解处理器使用详解
- java中调用数据库中的存储过程和函数
- Spring4.0学习笔记007——AOP基础:动态代理、概念解析
- debian安装jdk8
- java强行删除文件(针对进程正在使用的文件的删除)
- java中null和""的区别
- JSON 之JAVA 解析
- 严重: Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.Invoc
- Struts2初学 struts.xml详解 一
- spring aop代理不了父类,会忽略从父类继承的方法。
- struts2设置加载非默认路径的struts.xml文件解决方案
- Struts2初学 Struts.xml详解二
- Struts2初学 Struts2的action接收用户数据方式
- Struts2初学 struts2自定义类型转换器
- Struts2源码阅读(一)_Struts2框架流程概述
- 如何去掉Myeclipse对JS等文件的验证