java反射调用实体类getId,setId方法

 工具类:PropertyReflect

获取主键类型
获取主键值getId
给主键赋值setId
import com.awb.escachedb.common.utils.ExceptionStackTrace;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 反射调用实体类getId,setId方法
 * 主键字段默认为id
 * @Author: szw
 * @Date: 2020/5/25 14:41
 */
public class PropertyReflect {
    protected static final Logger LOGGER = LoggerFactory.getLogger(PropertyReflect.class);
    public static final String GET = "get";
    public static final String SET = "set";
    public static final String ID_NAME = "id";

    /**
     * 获取主键类型
     * @param bean Object
     * @return sbu
     */
    public static String getIdProperty(Object bean){
        try {
            Class<?> type = bean.getClass().getDeclaredField(ID_NAME).getType();
            return type.getSimpleName();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 获取主键值
     * @param bean 对象
     * @return String
     */
    public static String getId(Object bean){
        try{
            Class<? extends Object> tClass = bean.getClass();
            //得到所有属性
            Field[] field = tClass.getDeclaredFields();
            // 整合出 getId() 属性这个方法
            Method m = tClass.getMethod(GET + replaceFirst(getFirstName(field)));
            // 用这个整合出来的get方法,强转成自己需要的类型
            // 成功通过 T 泛型对象取到具体对象的 id !
            return (String)m.invoke(bean);
        }catch(Exception e){
            LOGGER.info("getId Exception: "+ ExceptionStackTrace.printStackTrace(e));
            return null;
        }
    }

    /**
     * 给主键赋值
     * @param bean 实体
     * @param id 主键值
     * @return String
     */
    public static String setId(Object bean, String id){
        try{
            Class<? extends Object> tClass = bean.getClass();
            //得到所有属性
            Field[] field = tClass.getDeclaredFields();
            String methodName = SET + replaceFirst(getFirstName(field));
            // 整合出 getId() 属性这个方法
            Method method = tClass.getDeclaredMethod(methodName, tClass.getDeclaredField(ID_NAME).getType());
            // 用这个整合出来的set方法
            method.invoke(bean, new Object[]{id});
            // 成功通过 T 泛型对象取到具体对象的 id !
            return id;
        }catch(Exception e){
            LOGGER.info("setId Exception: "+ ExceptionStackTrace.printStackTrace(e));
            return null;
        }
    }

    /**
     * 根据属性在实体类中的位置获取属性名
     * @param field 属性数组
     * @param index 属性在实体类中的位置
     * @return String
     */
    private static String getNameByIndex(Field[] field, int index) {
        //设置可以访问私有变量
        StringBuffer sbu = new StringBuffer("");
        for (int i = 0; i < field.length; i++) {
            if (i != index) {
                continue;
            }

            field[i].setAccessible(true);
            //获取属性的名字
            String name = field[i].getName();
            if (!StringUtils.isEmpty(name)) {
                //将属性名字的首字母大写
                name = name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());
                sbu.append(name);
                break;
            }
        }
        return sbu.toString();
    }

    /**
     * 根据属性在实体类中的名字获取属性名
     * @param field 属性数组
     * @param indexName 属性在实体类中的名字
     * @return String
     */
    private static String getNameByIndex(Field[] field, String indexName) {
        //设置可以访问私有变量
        StringBuffer sbu = new StringBuffer("");
        for (Field id:field) {
            id.setAccessible(true);
            //获取属性的名字
            String name = id.getName();
            if (!StringUtils.isEmpty(name) && org.apache.commons.lang.StringUtils.equals(name, indexName)) {
                //将属性名字的首字母大写
                name = name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());
                sbu.append(name);
                break;
            }
        }
        return sbu.toString();
    }

    /**
     * 将属性名字的首字母大写
     */
    private static String replaceFirst(String name) {
        return name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());
    }

    /**
     * 获取主键名
     * 默认主键是 field[0]
     */
    private static String getFirstName(Field[] field) {
        //设置可以访问私有变量
        field[0].setAccessible(true);
        return field[0].getName();
    }
    /**
     * 获取主键名
     * 默认主键是 field[0]
     */
    private static String getFirstName(Object bean) {
        Class<? extends Object> tClass = bean.getClass();
        //得到所有属性
        Field[] field = tClass.getDeclaredFields();
        //设置可以访问私有变量
        field[0].setAccessible(true);
        return field[0].getName();
    }

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是使用Java中的继承编写人类、教师、学生类的实体类代码: 1. 人类类: public class Person { private String name; private int age; private String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public int getAge() { return age; } public String getGender() { return gender; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setGender(String gender) { this.gender = gender; } } 2. 教师类: public class Teacher extends Person { private String subject; private String school; public Teacher(String name, int age, String gender, String subject, String school) { super(name, age, gender); this.subject = subject; this.school = school; } public String getSubject() { return subject; } public String getSchool() { return school; } public void setSubject(String subject) { this.subject = subject; } public void setSchool(String school) { this.school = school; } } 3. 学生类: public class Student extends Person { private String id; private String school; public Student(String name, int age, String gender, String id, String school) { super(name, age, gender); this.id = id; this.school = school; } public String getId() { return id; } public String getSchool() { return school; } public void setId(String id) { this.id = id; } public void setSchool(String school) { this.school = school; } } 以上代码中,Person类是基类,Teacher类和Student类都继承自Person类。在定义Teacher类和Student类时,使用“extends”关键字继承基类Person,并在构造函数中调用基类的构造函数 super(name, age, gender)。这样,Teacher类和Student类就具有Person类的属性和方法了。同时,在Teacher类和Student类中,定义了新的属性和方法,用于描述教师和学生的特定信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑶山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值