Java 奇淫技巧篇一
一 java 使用反射在dto和entity 实体类之间进行转换
背景 :getClass()的作用
getClass() 返回此 Object 的运行时该对象的类. 该方法返回一个Class对象。
可以通过该对象可以获取某个类的相关信息, 如构造方法、属性、方法等。
getClass()的使用:
public class Car {
private String name;
private int seat;
private void showCar(){
System.out.println(name + '有' + seat + "个座位");
}
}
package main;
public interface UseGetClass {
public static void main(String[] args) {
Car car = new Car();
Class carClass = car.getClass(); // 使用getClass获取该对象的类
System.out.println(carClass);
}
}
常见用法:
1getName()
和getCanonicalName()
getName()获取类名, getCanonicalName(): 返回权威的类名, 当为匿名类时, 返回输出的是null2
getDeclaredMethod()
返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法
其他常见用法:
getFields:获取public修饰的所有属性,返回一个Field数组(包括父类的)
getDeclaredFields:获取所有属性,返回一个Field数组
getField:传入一个参数(属性名),获取单个属性,返回一个Field对象,只能获取public修饰的
getDeclaredField:传入一个参数(属性名),获取单个属性,返回一个Field对象
getMethods:获取所有的public修饰的方法,包括父类的,返回Method
getDeclaredMethods:获取所有的返回,不包括父类,返回Method数组
getMethod:传入一个参数(方法名),返回一个Method对象,只能获取到public修饰的
getDeclared:传入一个参数(方法名),返回一个Method对象
newInstance:创建该类型的一个实例
Demo for dto 转 entity
package com.example.demo.utils;
import java.lang.reflect.Method;
import java.util.List;
import com.example.demo.domain.Users;
import com.example.demo.model.UsersModel;
public class Dto2Entity {
/**
*
* 将dto和entity之间的属性互相转换,dto中属性一般为String等基本类型,
*
* 但是entity中可能有复合主键等复杂类型,需要注意同名问题
*
* @param src
*
* @param target
*/
public static Object populate(Object src, Object target) {
Method[] srcMethods = src.getClass().getMethods();
Method[] targetMethods = target.getClass().getMethods();
for (Method m : srcMethods) {
String srcName = m.getName();
//startsWith() 方法用于检测字符串是否以指定的前缀开始。
//返回Boolean值 true或者false
if (srcName.startsWith("get")) {
try {
// 执行里面的get方法,得到结果
Object result = m.invoke(src);
for (Method mm : targetMethods) {
String targetName = mm.getName();
if (targetName.startsWith("set")
&& targetName.substring(3, targetName.length())
.equals(srcName.substring(3, srcName.length()))) {
// 执行set方法赋值
mm.invoke(target, result);
}
}
} catch (Exception e) {
}
}
}
return target;
}
/**
*
* dto集合和实体类集合间的互相属性映射
*
* @param src
*
* @param target
*
* @param targetClass
*
* @return
*/
@SuppressWarnings("unchecked")
public static <S, T> List<T> populateList(List<S> src, List<T> target,
Class<?> targetClass) {
for (int i = 0; i < src.size(); i++) {
try {
Object object = targetClass.newInstance();
target.add((T) object);
populate(src.get(i), object);
} catch (Exception e) {
continue;// 某个方法反射异常
}
}
return target;
}
public static void main(String[] args) {
Users users = new Users();
users.setId(1);
users.setUsername("huang");
users.setPassword("123456");
UsersModel usersModel = new UsersModel();
usersModel = (UsersModel) Dto2Entity.populate(users,usersModel);
System.out.println(usersModel.toString());
}
}