자바 에서 맵 과 대상 의 상호 전환 도구 류 의 실현 예시
1.map 전환 대상;
주요 사고방식 은 맵 에 있 는 키-value 를 꺼 내 서 주어진 대상 과 일치 시 키 는 것 입 니 다.도구 방법 을 더욱 통용 시 키 기 위해 서 는 주어진 대상 의 속성 을 반사 적 으로 얻 은 다음 에 반사 와 관련 된 API 와 맵 에 있 는 키-value 를 호출 하여 일치 시 키 면 됩 니 다.아래 는 코드 를 직접 올 리 면 됩 니 다.
/**
* map bean
*
* @param params
* @param clazz
* @return
*/
public static <T> T mapToBean(Map<String, Object> map, Class<?> clazz) throws Exception {
Object obj = clazz.newInstance();
if (map != null && !map.isEmpty() && map.size() > 0) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
String propertyName = entry.getKey(); //
Object value = entry.getValue(); //
String setMethodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
Field field = getClassField(clazz, propertyName); // map key
if (field == null){
continue;
}
Class<?> fieldTypeClass = field.getType();
value = convertValType(value, fieldTypeClass);
try {
clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
return (T) obj;
}
/**
*
* @param clazz
* @param fieldName
* @return
*/
private static Field getClassField(Class<?> clazz, String fieldName) {
if (Object.class.getName().equals(clazz.getName())) {
return null;
}
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
if (field.getName().equals(fieldName)) {
return field;
}
}
Class<?> superClass = clazz.getSuperclass(); // ,
if (superClass != null) { //
return getClassField(superClass, fieldName);
}
return null;
}
/**
* map value
* @param value
* @param fieldTypeClass
* @return
*/
private static Object convertValType(Object value, Class<?> fieldTypeClass) {
Object retVal = null;
if (Long.class.getName().equals(fieldTypeClass.getName())
|| long.class.getName().equals(fieldTypeClass.getName())) {
retVal = Long.parseLong(value.toString());
} else if (Integer.class.getName().equals(fieldTypeClass.getName())
|| int.class.getName().equals(fieldTypeClass.getName())) {
retVal = Integer.parseInt(value.toString());
} else if (Float.class.getName().equals(fieldTypeClass.getName())
|| float.class.getName().equals(fieldTypeClass.getName())) {
retVal = Float.parseFloat(value.toString());
} else if (Double.class.getName().equals(fieldTypeClass.getName())
|| double.class.getName().equals(fieldTypeClass.getName())) {
retVal = Double.parseDouble(value.toString());
} else {
retVal = value;
}
return retVal;
}
우 리 는 테스트 방법 을 써 서 상기 코드 를 검증 합 니 다.저 는 실체 류 produtInfo 를 미리 만 들 었 습 니 다.
public class ProductInfo {
private Long id;
private String name;
private Double price;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public ProductInfo(Long id, String name, Double price) {
super();
this.id = id;
this.name = name;
this.price = price;
}
public ProductInfo() {
super();
}
@Override
public String toString() {
return "ProductInfo [id=" + id + ", name=" + name + ", price=" + price + "]";
}
}
public static void main(String[] args) throws Exception {
Map<String, Object> param = new HashMap<>();
param.put("id", 12232);
param.put("name", "banana");
param.put("price", 12.25);
ProductInfo info = mapToBean(param, ProductInfo.class);
System.out.println(info.getName());
}
main 함 수 를 실행 하고 결 과 를 보면 콘 솔 이 결 과 를 성공 적 으로 인쇄 한 것 을 볼 수 있 습 니 다.2.대상 맵 전환,
사고 방향 은 상기 분석 과 유사 합 니 다.이것 은 반대로 전환 할 실체 류 를 지정 하고 반 사 를 통 해 실체 류 중의 필드 이름과 필드 값 을 얻 은 다음 에 map 의 key-value 에 일일이 설정 하고 다음은 코드 를 봅 니 다.
/**
* map
* @param obj
* @return
*/
private static Map<String, Object> objToMap(Object obj) {
Map<String, Object> map = new HashMap<String, Object>();
Field[] fields = obj.getClass().getDeclaredFields(); // f
for (int i = 0, len = fields.length; i < len; i++) {
String varName = fields[i].getName();
varName = varName.toLowerCase(); // key ,
try {
boolean accessFlag = fields[i].isAccessible(); //
fields[i].setAccessible(true); //
Object o = fields[i].get(obj); // f fields[i]
if (o != null){
map.put(varName, o.toString());
}
fields[i].setAccessible(accessFlag); //
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
}
return map;
}
다음은 테스트 방법 을 쓰 고,
public static void main(String[] args) throws Exception {
Map<String, Object> param = new HashMap<>();
param.put("id", 12232);
param.put("name", "banana");
param.put("price", 12.25);
ProductInfo info = mapToBean(param, ProductInfo.class);
System.out.println(info.getName());
System.out.println("---------------------");
Map<String, Object> map = objToMap(info);
System.out.println(" map : " + map);
}
실행,콘 솔 의 출력 결 과 를 보고 성공 적 으로 전환 되 었 음 을 설명 합 니 다.이상 은 맵 과 대상 간 에 상호 전환 을 실현 하 는 도구 류 입 니 다.여러분 은 앞으로 업무 중 에 필요 하 시 면 직접 가 져 가서 사용 하 실 수 있 습 니 다.부족 한 점 은 양해 해 주 십시오!많은 응원 부 탁 드 리 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.