利用Java反射消除 if/else 语句

前端页面会根据用户选择的下拉列表选项,传给后端相应的 Value 值,后端根据不同的 Value 值执行不同的业务逻辑,大致如下:

public String getSqlForField(String field){
	if ("AGE".equals(field)){
		// genSqlForAge
	} else if ("DATE".equals(field)){
		// genSqlForDate
	} else if ("REUSE".equals(field)){
		// genSqlForReuse
	} else 
	....
}

由于前端下拉选项都是固定的值,且不大会变。我这边打算使用反射的方式实现,逻辑是:定义一个请求处理类 A,里面的方法和前端下拉列表的值是一一对应的,请求转发类 B 根据前端传过来的具体的Value值,构建一个方法名,和请求处理类 A 的一个方法名精确匹配,利用反射的方式调用。这样就没有了 if/else 判断了。

请求处理类 A 的样子:

public class VarQueryBodyBuilder extends VarMapUtil {	
	// 用户可以不选择“属性”,就是 NoSpecified
	public String getNoSpecified(){
		...
	}
		
	// 是否复用,复术,复查等
	public String getReuse() {
		...
	}
	// 诊断,检测等的时间
	public String getDate() {
		...
	}
	// 诊断,检测等的年龄
	public String getAge() {
		...

请求转发类 B 是反射的实现主体代码:

String methodName = "get" + StringUtils.capitalize(field); 
logger.info("当前变量属性的SQL拼接将要调用的方法名为::" + methodName);

Class<? extends VarQueryBodyBuilder> clazz = vqb.getClass();
String sql = null;
try {
	Method m = clazz.getDeclaredMethod(methodName);
	sql = (String)m.invoke(vqb);
} catch (Exception e) {
	e.printStackTrace();
	throw new RuntimeException("自定义变量反射调用方法时出错::" + e.getMessage());
}

可以看到,构建 methodName, 就是 get 加上前端传过来的 Value 值首字符大写,就可以对应到 VarQueryBodyBuilder 的一个方法上,如果新增了一个下拉列表选项,就需要在 VarQueryBodyBuilder 再添加一个对应方法,而请求转发类 B 不用动,这样就消除了 if/else 语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java通过反射注解生成对应的SQL语句的步骤如下: 1. 定义注解:首先需要定义一个注解,该注解用于标识字段信息,例如字段名、字段类型、是否为主键等信息。 ``` @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String name(); // 字段名 String type(); // 字段类型 boolean primaryKey() default false; // 是否为主键 } ``` 2. 定义实体类:在实体类的字段上使用上面定义的注解。 ``` public class User { @Column(name = "id", type = "int", primaryKey = true) private int id; @Column(name = "name", type = "varchar") private String name; @Column(name = "age", type = "int") private int age; // 省略getter和setter方法 } ``` 3. 通过反射获取实体类的字段信息:通过反射获取实体类的字段信息,然后读取字段上的注解,获取字段名、字段类型和是否为主键等信息。 ``` public static <T> String generateCreateTableSql(Class<T> clazz) { StringBuilder sb = new StringBuilder(); sb.append("CREATE TABLE IF NOT EXISTS "); sb.append(clazz.getSimpleName()); sb.append("("); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { Column column = field.getAnnotation(Column.class); sb.append(column.name()); sb.append(" "); sb.append(column.type()); if (column.primaryKey()) { sb.append(" PRIMARY KEY"); } sb.append(","); } } sb.deleteCharAt(sb.length() - 1); sb.append(")"); return sb.toString(); } ``` 4. 生成SQL语句:将读取到的字段信息拼接成对应的SQL语句,例如创建表、插入数据、更新数据等。 ``` public static <T> String generateInsertSql(T entity) { StringBuilder sb = new StringBuilder(); sb.append("INSERT INTO "); sb.append(entity.getClass().getSimpleName()); sb.append("("); Field[] fields = entity.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { Column column = field.getAnnotation(Column.class); sb.append(column.name()); sb.append(","); } } sb.deleteCharAt(sb.length() - 1); sb.append(") VALUES ("); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { field.setAccessible(true); Object value = field.get(entity); if (value instanceof String) { sb.append("'"); sb.append(value); sb.append("'"); } else { sb.append(value); } sb.append(","); } } sb.deleteCharAt(sb.length() - 1); sb.append(")"); return sb.toString(); } ``` 以上就是利用反射注解生成对应的SQL语句的步骤,可以根据需要进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值