反射小练习

简介: 通过反射创建级联对象

package com.example.demo;

import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Objects;

/**

  • @author xiefenghong
  • @date 2022年02月14日 14:50
  • @describe 反射属性赋值

*/
public class ReflectTest {

@Test
public void run(){
    Person person = ClassInstanceFactory.createInstance(Person.class, "name:小明|id:1|cloth:{name:大衣|category:{name:羊毛衫}}|sex:male");
    System.out.println(person);
}

}
/*

  • @Author xiefenghong
  • @Description 实例工厂,用于实例化对象
  • @Date 18:20 2022/2/14
  • @Param
  • @return

**/
class ClassInstanceFactory{

private  ClassInstanceFactory(){};
public static <T>T createInstance(Class<T> obj,String value){
    T instance =null;
    try {
        instance = obj.getDeclaredConstructor().newInstance();
        InstallBeanUtils.installBeanValue(instance,value);
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
    return instance;
}

}
@Data
class Person{

private String name;
private Integer id;
private Cloth cloth;
private String sex;

}
@Data
class Cloth{

private String name;
private Category category;

}
@Data
class Category{

private String name;

}
/**

  • @Author xiefenghong
  • @Description 封装属性工具类
  • @Date 18:20 2022/2/14
  • @Param
  • @return

**/
class InstallBeanUtils{

/*
 * @Author xiefenghong
 * @Description 属性封装
 * @Date 18:20 2022/2/14
 * @Param [obj, val]
 * @return void
 **/
public static void installBeanValue(Object obj,String val) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    if (StringUtils.isBlank(val)){
        return;
    }
    if(Objects.isNull(obj)){
        throw new NullPointerException("实例对象为null");
    }
    String valParent=val;
    String valChild=null;
    if(val.contains("{")){
        valParent=val.substring(0,val.indexOf("{"))+"?"+val.substring(val.lastIndexOf("}")+1);
        valChild=val.substring(val.indexOf("{")+1,val.lastIndexOf("}"));
    }
    Class<?> aClass = obj.getClass();
    String[] valuePairs = valParent.split("\\|");
    for (String valuePair : valuePairs){
        try {
            String[] values = valuePair.split(":");
            Field field = aClass.getDeclaredField(values[0]);
            if(valuePair.contains("?")){
                Method method = aClass.getDeclaredMethod(methodNameJoint("get",field));
                Object childObj = method.invoke(obj);
                if (Objects.isNull(childObj)){
                    Method setMethod = aClass.getDeclaredMethod(methodNameJoint("set", field), field.getType());
                    setMethod.invoke(obj,field.getType().getConstructor().newInstance());
                    childObj= method.invoke(obj);
                }
                try {
                    installBeanValue(childObj,valChild);
                }catch (Exception e){
                    System.out.println("子类赋值失败");
                }
                continue;
            }
            Method method = aClass.getDeclaredMethod(methodNameJoint("set",field), field.getType());
            Object value= methodTypeValue(field, values[1]);
            method.invoke(obj,value);
        }catch (Exception e){
            System.out.println(valuePair+"赋值失败");
        }
    }
}
/**
 * @Author xiefenghong
 * @Description 属性的值类型转换
 * @Date 18:23 2022/2/14
 * @Param [field, val]
 * @return java.lang.Object
 **/
protected static Object methodTypeValue(Field field,String val){
    Object obj=null;
    if("java.lang.String".equals(field.getType().getName())){
        return val;
    }else if ("java.lang.Integer".equals(field.getType().getName())){
        obj=Integer.valueOf(val);
    }
    return obj;
}
/*
 * @Author xiefenghong
 * @Description 获取get,set方法
 * @Date 18:23 2022/2/14
 * @Param [prefix, field]
 * @return java.lang.String
 **/
protected static String methodNameJoint(String prefix,Field field){
    String name = field.getName().substring(0, 1).toUpperCase();
    if (field.getName().length()==1){
        return prefix+name;
    }
    return prefix+name+field.getName().substring(1);
}

}

相关文章
|
存储 安全 Unix
ECF机制:信号处理
ECF机制:信号处理
189 0
|
资源调度 数据可视化 JavaScript
一个高效的低代码表单,可视化设计,一键生成源码,享受更多摸鱼时间!
Variant Form 是一款基于 Vue 2 的低代码表单生成器,采用可视化拖拽设计界面,支持一键生成完整源码,大幅降低开发复杂度。它具备高度自定义配置能力,能够满足不同场景需求,并且完全开源免费。通过简单的拖拽操作,用户可以轻松创建表单,同时还能自定义 CSS 样式、校验逻辑及多语言支持等功能。安装便捷,兼容多种环境,极大提升开发效率。赶紧试试 Variant Form,享受高效开发的乐趣吧!
302 0
|
移动开发 前端开发 JavaScript
H5+CSS3+JS逆向前置——4、DIV+CSS绘制旗帜练习
H5+CSS3+JS逆向前置——4、DIV+CSS绘制旗帜练习
152 0
|
JSON 弹性计算 前端开发
如何规范 RESTful API 的业务错误处理
如何规范 RESTful API 的业务错误处理
2045 0
|
弹性计算 Java 关系型数据库
飞天计划
飞天计划
1030 0
|
Java 编译器
JavaSE——抽象类和接口详解
JavaSE——抽象类和接口详解
|
存储 Swift 开发者
Swift专题讲解十五——类型构造(一)
Swift专题讲解十五——类型构造
341 0
Swift专题讲解十五——类型构造(一)
|
程序员 C++
《数学与泛型编程:高效编程的奥秘》一1.3 阅读准备
本节书摘来自华章出版社《数学与泛型编程:高效编程的奥秘》一 书中的第1章,第1.3节,作者:丹尼尔E.罗斯(Daniel E. Rose),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1349 0
|
2天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。