Java8通过Function获取字段名的步骤
摘要:Java8通过Function获取字段名,解决硬编码,效果类似于mybatis-plus的LambdaQueryWrapper。
本文总共三个步骤:
1、使Function获取序列化能力;
2、通过SFunction获取字段名;
3、建一些业务代码进行测试;
使Function获取序列化能力
importjava.io.Serializable; importjava.util.function.Function; /** *使Function获取序列化能力 */ @FunctionalInterface publicinterfaceSFunctionextendsFunction ,Serializable{ }
通过SFunction获取字段名
importjava.lang.invoke.SerializedLambda;
importjava.lang.reflect.Field;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
publicclassColumnUtil{
publicstaticStringgetName(SFunctionfn){
//从function取出序列化方法
MethodwriteReplaceMethod;
try{
writeReplaceMethod=fn.getClass().getDeclaredMethod("writeReplace");
}catch(NoSuchMethodExceptione){
thrownewRuntimeException(e);
}
//从序列化方法取出序列化的lambda信息
booleanisAccessible=writeReplaceMethod.isAccessible();
writeReplaceMethod.setAccessible(true);
SerializedLambdaserializedLambda;
try{
serializedLambda=(SerializedLambda)writeReplaceMethod.invoke(fn);
}catch(IllegalAccessException|InvocationTargetExceptione){
thrownewRuntimeException(e);
}
writeReplaceMethod.setAccessible(isAccessible);
//从lambda信息取出method、field、class等
StringfieldName=serializedLambda.getImplMethodName().substring("get".length());
fieldName=fieldName.replaceFirst(fieldName.charAt(0)+"",(fieldName.charAt(0)+"").toLowerCase());
Fieldfield;
try{
field=Class.forName(serializedLambda.getImplClass().replace("/",".")).getDeclaredField(fieldName);
}catch(ClassNotFoundException|NoSuchFieldExceptione){
thrownewRuntimeException(e);
}
//从field取出字段名,可以根据实际情况调整
TableFieldtableField=field.getAnnotation(TableField.class);
if(tableField!=null&&tableField.value().length()>0){
returntableField.value();
}else{
returnfieldName.replaceAll("[A-Z]","_$0").toLowerCase();
}
}
}
建一些业务代码进行测试
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.lang.annotation.Target;
/**
*字段名注解。测试用
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceTableField{
Stringvalue()default"";
}
importjava.io.Serializable;
/**
*用户实体类。测试用
*/
publicclassUserimplementsSerializable{
privateStringloginName;
@TableField("nick")
privateStringnickName;
publicStringgetLoginName(){
returnloginName;
}
publicvoidsetLoginName(StringloginName){
this.loginName=loginName;
}
publicStringgetNickName(){
returnnickName;
}
publicvoidsetNickName(StringnickName){
this.nickName=nickName;
}
}
/**
*测试用
*/
publicclassTest{
publicstaticvoidmain(String[]args){
System.out.println("字段名:"+ColumnUtil.getName(User::getLoginName));
System.out.println("字段名:"+ColumnUtil.getName(User::getNickName));
}
}
运行结果:
字段名:login_name
字段名:nick
到此这篇关于Java8通过Function获取字段名的文章就介绍到这了,更多相关java8function字段名内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!