java反射重构,重构 -- Java反射机制简单使用

一、背景

最近在开发中写了一些功能重复的方法,这些方法唯一不同的地方就是入参都是比较类似的bean,只是为了区分不同的使用场景,创建了多个结构组成类似的多个bean,然后在处理每一个bean的时候都单独写了一个私有方法,具体场景看下面代码。

二、重构前

工具类

/**

* @author 一波怼

* @date 2019/3/29

**/

@Slf4j

public class JaxbUtil {

public static String convertBeanToXml(Object obj) throws Exception {

JAXBContext context = JAXBContext.newInstance(obj.getClass());

Marshaller marshaller = context.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

StringWriter writer = new StringWriter();

writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");

marshaller.marshal(obj, writer);

return writer.toString();

}

}

要转换的bean

/**

* @author 一波怼

* @date 2019/3/29

**/

@Data

@XmlRootElement(name = "header")

@XmlAccessorType(XmlAccessType.FIELD)

public class RequestHeader {

@XmlElement

private String type;

@XmlElement

private String encoding;

}

@Data

@XmlRootElement(name = "root")

@XmlAccessorType(XmlAccessType.FIELD)

public class CommonRequest {

@XmlElement

private RequestHeader header;

@XmlElement

private CommonRequestBody body;

}

@Data

@XmlRootElement(name = "body")

@XmlAccessorType(XmlAccessType.FIELD)

public class CommonRequestBody {

@XmlElement

private String param1;

@XmlElement

private String param2;

public CommonRequestBody() {

}

public CommonRequestBody(String param1, String param2) {

this.param1 = param1;

this.param2 = param2;

}

}

@Data

@XmlRootElement(name = "root")

@XmlAccessorType(XmlAccessType.FIELD)

public class UserRequest {

@XmlElement

private RequestHeader header;

@XmlElement

private UserRequestBody body;

}

@Data

@XmlRootElement(name = "body")

@XmlAccessorType(XmlAccessType.FIELD)

public class UserRequestBody {

@XmlElement

private String name;

@XmlElement

private Integer age;

public UserRequestBody() {

}

public UserRequestBody(String name, Integer age) {

this.name = name;

this.age = age;

}

}

测试类

@Slf4j

public class Main {

public static void main(String[] args) throws Exception{

RequestHeader header = new RequestHeader();

header.setEncoding("utf8");

header.setType("X");

CommonRequestBody commonRequestBody = new CommonRequestBody("1", "2");

String commonRequestXml = getCommonRequestXml(commonRequestBody, header);

UserRequestBody userRequestBody = new UserRequestBody("张三", 10);

String userRequestXml = getUserRequestXml(userRequestBody, header);

log.info("commonRequestXml = {}, userRequestXml = {}", commonRequestXml, userRequestXml);

}

private static String getCommonRequestXml(CommonRequestBody body, RequestHeader header) throws Exception{

CommonRequest commonRequest = new CommonRequest();

commonRequest.setHeader(header);

commonRequest.setBody(body);

return JaxbUtil.convertBeanToXml(commonRequest);

}

private static String getUserRequestXml(UserRequestBody body, RequestHeader header) throws Exception {

UserRequest userRequest = new UserRequest();

userRequest.setHeader(header);

userRequest.setBody(body);

return JaxbUtil.convertBeanToXml(userRequest);

}

}

Main中要获得对应bodyBean转换后的XML格式字符串,每种bodyBean类型都需要单独的方法处理getCommonRequestXml()和getUserRequestXml(),存在重复的逻辑。

三、重构后

修改测试类

传入需要得到的xxxRequest.class,通过反射获取实例,通过Field得到成员变量,拼装Getter方法进行赋值,最后调用工具类进行转换。

/**

* @author 一波怼

* @date 2019/3/29

**/

@Slf4j

public class Main {

public static void main(String[] args) throws Exception {

RequestHeader header = new RequestHeader();

header.setEncoding("utf8");

header.setType("X");

CommonRequestBody commonRequestBody = new CommonRequestBody("1", "2");

UserRequestBody userRequestBody = new UserRequestBody("张三", 10);

log.info("commonRequestXml = {}, userRequestXml = {}",

getRequest(commonRequestBody, header, CommonRequest.class),

getRequest(userRequestBody, header, UserRequest.class));

}

private static String getRequest(Object body,

RequestHeader header,

Class> requestClass) throws Exception {

Object request = requestClass.newInstance();

Field[] declaredFields = requestClass.getDeclaredFields();

for (Field field : declaredFields) {

String fieldName = field.getName();

String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);

Method method;

if (StringUtils.equals(fieldName, "header")) {

method = requestClass.getMethod(methodName, header.getClass());

method.invoke(request, header);

} else if (StringUtils.equals(fieldName, "body")) {

method = requestClass.getMethod(methodName, body.getClass());

method.invoke(request, body);

}

}

return JaxbUtil.convertBeanToXml(request);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值