自定义注解获取属性名

1 背景
对于以下代码, 小组内存在分歧

    @Override
    public List<Student> getByParam(Student student) {
        return this.selectList(
                new EntityWrapper<Student>()
                        .eq("student_name", student.studentName)
                        .eq("student_age", student.studentAge);
    }

在这里插入图片描述
2 定义工具类实现

	/**
	 * 直接通过 fields[index]获取存在问题: 实体属性可能增减, 顺序可能打乱, 不可靠
	 */
	Field[] fields = clazz.getDeclaredFields();

2.1 注解, 实体类

package com.***.***;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    int index() default 0;
}

----------------------------------------------

package com.***.***;

public class Student {

    @MyAnnotation(index = 1)
    private String studentName;

    @MyAnnotation(index = 2)
    private Integer studentAge;

    public Student() {
    }

    // getter and setter
}

2.2 注解效果测试, 输出

	@Test
	public void fun15() throws ClassNotFoundException {
		Class<?> clazz = Class.forName("com.***.***.Student");
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {
			if (field.getAnnotation(MyAnnotation.class).index() == 1) {
				String s = field.toString();
				System.out.println(s);	// private java.lang.String com.***.***.Student.studentName
				System.out.println(s.substring(s.lastIndexOf(".") + 1));	// studentName
			}
		}
	}

3 实体属性转数据库字段的下划线格式

	@Test
	public void fun16() {
		String s = "studentName";
		String string = this.getString(s);
		System.out.println(string);	// student_name
	}
	
	private String getString(String s) {
		if (StringUtils.isBlank(s)) {
			return "";
		}
		char[] chars = s.toCharArray();
		StringBuilder sb = new StringBuilder();
		char low, c;
		for (int i = 0; i < chars.length; i++) {
			c = chars[i];
			if (Character.isUpperCase(c)) {
				sb.append("_").append(Character.toLowerCase(c));
				continue;
			}
			sb.append(c);
		}
		return sb.toString();
	}

3.1 测试及输出

	@Test
	public void fun17() throws Exception {
		String name = this.fieldToHump(Class.forName("com.***.***.Student"), 1);
		System.out.println(getString(name));	// student_name
	}
	
	// 获取指定属性(index: 想要的属性对应的注解值)
	private String fieldToHump(Class clazz, int index) throws Exception {
		Field[] fields = clazz.getDeclaredFields();
		String s;
		for (Field field : fields) {
			if (field.getAnnotation(MyAnnotation.class).index() == index) {
				s = field.toString();
				return s.substring(s.lastIndexOf(".") + 1);
			}
		}
		throw new RuntimeException("Are u stupid");
	}

3.2 替代方案

	// 原先代码中有很多这种字符串 
    @Override
    public List<Student> getByParam(Student student) {
        return this.selectList(
                new EntityWrapper<Student>()
                        .eq("student_name", student.studentName)
                        .eq("student_age", student.studentAge);
    }
    
------------------------------------------------------------

	// 可以写成
	@Override
  public List<Student> getByParam(Student student) {
        return this.selectList(
                new EntityWrapper<Student>()
                        .eq(getString(fieldToHump(student.getClass(), 1)), studentName)
                        .eq(getString(fieldToHump(student.getClass(), 2)), studentAge);
    }
	

4 其实已经存在解决方案(lombok版本有要求)

package com.***.***;

import lombok.experimental.FieldNameConstants;

@FieldNameConstants
public class Student {

    private String studentName;
    
    private Integer studentAge;

    public Student() {
    }

    // getter and setter
}

------------------------------------------------------------

    @Test
    public void test18() {
		String studentName = Student.Fields.studentName;
		String studentAge = Student.Fields.studentAge;
		System.out.println(studentName);	// studentName
		System.out.println(studentAge);	// studentAge
	}
	
------------------------------------------------------------

	<!--lombok支持 -->
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.18.12</version>
		<scope>provided</scope>
	</dependency>
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值