一:解析properties,并封装到指定对象
1.1题目
properties文件
user.class = com.czxy.domain.User
user.username = jack
user.password = 1234
user.age = 18//编写程序,打印如下效果:
System.out.print(user);User{username='jack', password='1234', age='18'}
1.2 实现思路
- 创建一个文件对象,指向名为"user.properties"的属性文件。
- 创建一个
Properties
对象,用于加载属性文件。 - 使用
load()
方法加载属性文件内容到Properties
对象中。 - 通过
getProperty()
方法获取属性文件中的username
字段。 - 使用反射,通过
Class.forName()
方法获取名为user.class
的类名对应的Class
对象。 - 实例化该类,使用
newInstance()
方法创建一个对象。 - 遍历属性文件中的所有属性名(通过
stringPropertyNames()
方法获取),排除user.class
。 - 构建对应的set方法名,格式为"set" + 属性名的首字母大写 + 剩余部分。
- 使用
getMethod()
方法获取set方法,并设置参数类型为String。 - 使用
invoke()
方法调用set方法,将属性值设置到实例化的对象中。 - 输出对象的字符串表示形式。
1.3代码实现
user.java:
public class User {
public String username;
public String password;
public String age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
System.out.println("111111111");
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public User() {
System.out.println(" 获取到当前类");
}
public User(String username, String password, String age) {
this.username = username;
this.password = password;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age='" + age + '\'' +
'}';
}
}
user.properties:
username =jack
password =1234
age=18
user.class = User
userTest:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.lang.reflect.Method;
import java.util.Properties;
public class UserTest {
public static void main(String[] args) throws Exception {
//创建文件对象
File file = new File("./HomeWork03/src/user.properties");
// System.out.println(file.exists());
//创建properties对象
Properties properties = new Properties();
//加载文件
properties.load(new FileInputStream(file));
// 获取字段
properties.getProperty("username");
//反射操作
// 获取类
Class c = Class.forName(properties.getProperty("user.class"));
// 实例化对象
Object userObject=c.newInstance();
// 通过所有变量名来遍历
// stringPropertyNames 获取所有属性 名字
for (String key : properties.stringPropertyNames()) {
if (!key.equals("user.class")) {
// 获取set方法名
//key.substring(0, 1).toUpperCase() + key.substring(1); 将第一个字符转为大写
String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1);
// 获取set方法
Method method = c.getMethod(methodName, String.class);
// 执行set方法
method.invoke(userObject, properties.getProperty(key));
}
}
System.out.println(userObject.toString());
}
}
2.解析xml通过反射封装到指定对象
1.1题目
<beans>
<bean id="student1" class="com.czxy.domain.Student">
<property name="studentName" value="张三"></property>
<property name="gender" value="男"></property>
<property name="age" value="18"></property>
</bean>
<bean id="student2" class="com.czxy.domain.Student">
<property name="studentName" value="李四"></property>
<property name="gender" value="女"></property>
<property name="age" value="21"></property>
</bean>
</beans>
编写程序:
System.out.print(obj);输入的结果
Student{studentName='张三', gender='男', age='18'}
Student{studentName='李四', gender='女', age='21'}
2.2实现思路
- 创建一个文件对象,指向要解析的XML文件。
- 创建一个SAXReader对象,用于解析XML文档。
- 使用SAXReader的read()方法解析XML文档,得到一个Document对象。
- 获取XML文档的根元素。
- 遍历所有的"bean"元素。
- 创建一个HashMap对象,用于存放"property"元素的name和value的对应关系。
- 使用反射,通过Class.forName()方法获取类名对应的Class对象。
- 实例化该类,使用newInstance()方法创建一个对象。
- 遍历当前"bean"元素下的所有"property"子元素。
- 获取"property"元素的name和value属性值。
- 构建对应的set方法名,格式为"set" + 属性名的首字母大写 + 剩余部分。
- 使用getMethod()方法获取set方法,并设置参数类型为String。
- 使用invoke()方法调用set方法,将属性值设置到实例化的对象中。
- 输出对象的字符串表示形式。
- 如果需要,可以将对象存放到HashMap中以便后续使用。
2.3代码实现
student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<bean id="student1" class="Student">
<property name="studentName" value="张三"></property>
<property name="gender" value="男"></property>
<property name="age" value="18"></property>
</bean>
<bean id="student2" class="com.czxy.domain.Student">
<property name="studentName" value="李四"></property>
<property name="gender" value="女"></property>
<property name="age" value="21"></property>
</bean>
</beans>
Student.java
public class Student {
String studentName;
String gender;
String age;
public Student(String studentName, String gender, String age) {
this.studentName = studentName;
this.gender = gender;
this.age = age;
}
public Student() {
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"studentName='" + studentName + '\'' +
", gender='" + gender + '\'' +
", age='" + age + '\'' +
'}';
}
}
StudentTest:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import javax.xml.transform.sax.SAXResult;
import java.io.File;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
public class StudentTest {
public static void main(String[] args) throws Exception {
File file = new File("./HomeWork03/src/student.xml");
// 创建核心工具类用于解析文档
SAXReader SAXReader = new SAXReader();
// 解析文档
Document document = SAXReader.read(file);
// 获取所有根元素
Element rootelement =document.getRootElement();
// 获取所有bean元素
List<Element> bean = rootelement.elements("bean");
// 每一项name对应的value
HashMap<String,Object> elMap;
// 获取类
Class c = Class.forName("Student");
// 实例化的数据
Object userObject = null;
for (Element item:bean){
// 存放name 和value的对应表
elMap = new HashMap<>();
// 实例化对象
userObject=c.newInstance();
// 获得property 子标签
List<Element> propertyList = item.elements("property");
for (Element itemEl:propertyList){
String propertyName = itemEl.attributeValue("name");
String propertyValue = itemEl.attributeValue("value");
String methodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
// System.out.println(methodName);
// 获取set方法
Method method = c.getMethod(methodName, String.class);
// 执行set方法
method.invoke(userObject,propertyValue);
}
System.out.println(userObject.toString());
//
String id = item.attributeValue("id");
elMap.put(id,userObject);
}
}
}