目录
3.将一行文本 ---> 转为Map--->调用方法 makeObject(date, clazz)转为User对象输出
一.设置一个工具类,利用反射设置两个获取值和设置值的方法
1.获取一个对象某个属性的值
public static Object getProperty(Object obj, String fieldName);
步骤:
{1}获取对象的字节码
{2}获取字段对象
{3}设置其可访问的权限
{4}获取字段的值
// {1}获取一个对象某个属性的值..
public static Object getProperty(Object obj, String fieldName) throws NoSuchFieldException {
// {1}获取对象的字节码。
Class class1 = obj.getClass();
// {2}获取字段对象。
Field f1 = class1.getDeclaredField(fieldName);
// {3}设置其可访问的权限。
f1.setAccessible(true);
Object object = null;
try {
// {4}获取字段的值。
// 格式: [字段].get( 主调对象 );
object = f1.get(obj);
} catch (IllegalArgumentException | IllegalAccessException e) {
// {ps}这些异常不太会发生, 在这里直接处理。
e.printStackTrace();
}
return object;
}
2.设置一个对象某个属性的值
public static void setProperty(Object obj, String fieldName, String value);
步骤:
{1}获取对象的字节码
{2}获取字段对象
{3}设置其可访问的权限
{4}设置字段的值
// {2}设置一个对象某个属性的值..
public static void setProperty(Object obj, String fieldName, String value) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
// {1}获取对象的字节码。
Class class1 = obj.getClass();
// {2}获取字段对象。
Field f1 = class1.getDeclaredField(fieldName);
// {3}设置其可访问的权限。
f1.setAccessible(true);
f1.set(obj, value);
3.测试1:获取属性的值
package com.gongsi.cn.test2;
public class User {
private String username;
private String password;
private String address;
private String no;
private String sex;
private int age;
private double weight;
private String createDate;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", address=" + address + ", no=" + no
+ ", sex=" + sex + ", age=" + age + ", weight=" + weight + ", createDate=" + createDate + "]";
}
}
package com.gongsi.cn.test2;
import java.util.Map;
import java.util.Scanner;
public class TestMain {
//{ps}传统方式的弊端是什么 ?
//void setParameter(Map<String,Object> map){
// User user = new User(); //代码中硬编码
// user.setUsername( (String)map.get("username") );
// user.setPassword( (String)map.get("password") );
//-----
//}
void setParameter(Map<String,Object> map){
}
public static void main(String[] args) {
User user = new User();
user.setAddress("广东广州");
Scanner sc = new Scanner(System.in);
while( true ){
System.out.println("请输入你想获取的属性名。。");
String field = sc.nextLine();
Object obj;
try {
obj = BeanUtils.getProperty(user, field);
System.out.println( obj );
} catch (NoSuchFieldException e) {
System.out.println( "很抱歉, 找不到你要的属性。" );
}
}
}
}
4.测试2:设置属性的值
package com.gongsi.cn.test2;
import java.util.Scanner;
public class TestMain2 {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
User user=new User();
//在实际应用中,这样用得不多
Scanner scanner =new Scanner(System.in);
int i=1;
while (i==1) {
System.out.println("请输入要设置的属性和值:");
String line=scanner.nextLine();
if ("exit".equals(line)) {
break;
}
String data[]=line.split(",");
BeanUtils.setProperty(user, data[0], data[1]);
}
System.out.println(user);
}
}
二.升级版
设置了三个方法:
1.设置一个对象某个属性的值的方法
public static void setValue( Field field,Object bean, String value )
步骤:
{1}因为传入的是字符串, 所以这里要得到字段的类型
{2}设置可以访问权限
{3}值为空退出方法, 不去设置
{4}判断是否为 String 类型, 进行设置...
{5}判断是否为 int/Integer 类型, 进行设置...
{6}判断是否为 double/Double 类型, 进行设置...
{7}判断是否为 float/Float 类型, 进行设置...
{8}判断是否为 long/Long 类型, 进行设置... 从String转类型
//{ps}方法功能: 设置一个对象某个属性的值。
public static void setValue( Field field,
Object bean, String value )
throws IllegalArgumentException
{
//{1}因为传入的是字符串, 所以这里要得到字段的类型
Class type = field.getType();
//{2}设置可以访问权限。。
field.setAccessible(true);
if(value==null){ //{3}值为空退出方法, 不去设置。
return;
}
try{
//{3}判断是否为 String 类型, 进行设置...
//{4}判断是否为 int/Integer 类型, 进行设置...
//{5}判断是否为 double/Double 类型, 进行设置...
//{6}判断是否为 float/Float 类型, 进行设置...
//{7}判断是否为 long/Long 类型, 进行设置... 从String转类型
if (String.class==type) {
field.set(bean, value);
}if (int.class==type||Integer.class==type) {
field.set(bean, Integer.valueOf(value));
}if (double.class==type||Double.class==type) {
field.set(bean, Double.valueOf(value));
}if (float.class==type||Float.class==type) {
field.set(bean, Float.valueOf(value));
}if (long.class==type||Long.class==type) {
field.set(bean, Long.valueOf(value));
}
}
catch(IllegalAccessException e){
e.printStackTrace();
}
}
2.制作一个对象:map->转为对象输出
public static <T> T makeObject(Map<String,String> data, Class<T> clazz )
步骤:
{1}根据字节码来创建对象
{2}迭代 map中所有键值 把map中的key值放入集合Set中
{3}循环获取key
{4}根据 key 获取字段对象。“username”
{5}根据 key 获取对应的 值。“Andy”
{6}调用 setValue() 填充对象的属性值
{7}返回一个对象
//{ps}makeObject 方法 [制作一个对象]
//功能:map->转为对象输出
public static <T> T makeObject(
Map<String,String> data, Class<T> clazz )
throws InstantiationException, IllegalAccessException {
//{1}根据字节码来创建对象(JavaBean).
T t = clazz.newInstance();
//{2}迭代 map中所有键值 把map中的key值放入集合Set中
Set<String> keySet = data.keySet();
//循环获取key
for (String field : keySet) {
try {
//{3}根据 key 获取字段对象。“username”
Field f = clazz.getDeclaredField(field);
//{4}根据 key 获取对应的 值。“Andy”
String value=data.get(field);
//{5}调用 setValue() 填充对象的属性值。
setValue(f, t, value);
} catch (NoSuchFieldException e) {
e.printStackTrace();
System.out.printf("{JSON解析器}设有这个字段:%s",field);
}
}
//{5}返回一个对象
return t;
}
3.将一行文本 ---> 转为Map--->调用方法 makeObject(date, clazz)转为User对象输出
public static <T> T parseJsonText(String line, Class<T> clazz )
步骤:
{1}.定义了一个匹配规则
{2}正则表达式的编译处理器
{3}生成一个匹配器
{4}定义一个 HashMap 存放键值对
{5}反复的去查找匹配的子串
{6}以组1(为键),组2(为值)存入 map
{7}调用 makeObject 直接生成对象
//parseJsonText方法
//功能:将一行文本 ---> 转为Map--->调用方法 makeObject(date, clazz)转为User对象输出
public static <T> T parseJsonText(String line, Class<T> clazz ) throws InstantiationException, IllegalAccessException {
//{1}.定义了一个匹配规则
String regex="(\"([^\"]+)\":\"([^\"]+)\")";
//{2}正则表达式的编译处理器
Pattern patt = Pattern.compile(regex);
//{3}生成一个匹配器。
Matcher mat = patt.matcher(line);
//{4}定义一个 HashMap 存放键值对
Map<String, String>date=new HashMap();
//{5}反复的去查找匹配的子串
while (mat.find()) {
//{6}以组1(为键),组2(为值)存入 map
date.put(mat.group(2), mat.group(3));
}
//{6}调用 makeObject 直接生成对象。
return makeObject(date, clazz);
}
4.测试1:makeObject 方法 [制作一个对象]
package com.gongsi.cn.test3;
public class User {
private String username;
private String password;
private String address;
private String no;
private String sex;
private int age;
private double weight;
private String createDate;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", address=" + address + ", no=" + no
+ ", sex=" + sex + ", age=" + age + ", weight=" + weight + ", createDate=" + createDate + "]";
}
}
package com.gongsi.cn.test3;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class TestMain {
public static void main(String[] args)
throws InstantiationException,
IllegalAccessException,
ClassNotFoundException {
Map<String,String> data = new HashMap<>();
data.put("username", "andy");
data.put("password", "123");
data.put("address", "andy");
data.put("no", "andy");
data.put("sex", "andy");
data.put("age", "50");
data.put("weight", "55.66");
//{1}关键点在这里。
Scanner sc = new Scanner(System.in);
System.out.println("请输入你需要的类在哪里:");
String clsName = sc.nextLine();
Class clazz = Class.forName( clsName );
Object obj = JsonParser.makeObject(
data, clazz );
System.out.println( obj );
}
}
5:测试2:parseJsonText方法
package com.gongsi.cn.test3;
import java.util.Scanner;
//测试JsonParser.parseJsonText(line, clazz)方法
public class TestMain2 {
static String line = "{"+
"\"username\":\"andy\","+
"\"password\":\"123\","+
"\"sex\":\"男\","+
"\"no\":\"no01\","+
"\"address\":\"广东深圳\","+
"\"age\":\"56\""+
"}";
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你需要的类在哪里:");
String clsName = sc.nextLine();
Class clazz=Class.forName(clsName);
Object object=JsonParser.parseJsonText(line, clazz);
System.out.println(object);
}
}