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);
    }
}

常见用法:
1 getName()getCanonicalName() getName()获取类名, getCanonicalName(): 返回权威的类名, 当为匿名类时, 返回输出的是null

2 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());
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值