起因
最近遇到了一个问题,就是在查询的时候要根据一个类里面有的属性名进行排序,之前是把所有要排序的名写在了一个Set里面,然后去找传入值是否与属性相等,这样就防止了order by的sql注入。
但是每次都要把Set里面的所有参数都写一遍,这样不够复用,所以就想着,通过反射去拿类的属性名,再去检验传入参数是否和属性名相同,不相同返回false。
解决
通过反射去找到类的属性,生成Set,然后去看传入的String在不在Set里面。
书的实体类:
/**
* 书实体类
*
*/
@Data
public class Book{
public int id;// 编号
public String name;// 名称
public double price; // 价格
private String author;// 作者
}
通过反射查询类里面有没有这个属性名:
/**
* 通过反射查询类里面有没有这个属性名
*/
public class StringAndClassTest {
public static Boolean isStringInClassFieldsName(Class classNameClass,String value){
Set<String> classNameSet = getFieldsNameSet(classNameClass);
if(classNameSet.contains(value)){
return true;
}
return false;
}
public static Set getFieldsNameSet(Class classNameClass){
Field fields[]=classNameClass.getClass().getDeclaredFields();
String[] name=new String[fields.length];
for (int i = 0; i < name.length; i++) {
name[i] = fields[i].getName();
}
Set<String> classNameSet = new HashSet<>(Arrays.asList(name));
return classNameSet;
}
public static void main(String[] args) {
System.out.println(isStringInClassFieldsName(Book.class,"name"));
}
}