摘要:java8通过function获取字段名。不用再硬编码,效果类似于mybatis-plus的lambdaquerywrapper。
本文总共三个步骤:
1、使function获取序列化能力;
2、通过sfunction获取字段名;
3、建一些业务代码进行测试;
使function获取序列化能力
import java.io.serializable;
import java.util.function.function;
/**
* 使function获取序列化能力
*/
@functionalinterface
public interface sfunction extends function, serializable {
}
通过sfunction获取字段名
import java.lang.invoke.serializedlambda;
import java.lang.reflect.field;
import java.lang.reflect.invocationtargetexception;
import java.lang.reflect.method;
public class columnutil {
public static string getname(sfunction fn) {
// 从function取出序列化方法
method writereplacemethod;
try {
writereplacemethod = fn.getclass().getdeclaredmethod("writereplace");
} catch (nosuchmethodexception e) {
throw new runtimeexception(e);
}
// 从序列化方法取出序列化的lambda信息
boolean isaccessible = writereplacemethod.isaccessible();
writereplacemethod.setaccessible(true);
serializedlambda serializedlambda;
try {
serializedlambda = (serializedlambda) writereplacemethod.invoke(fn);
} catch (illegalaccessexception | invocationtargetexception e) {
throw new runtimeexception(e);
}
writereplacemethod.setaccessible(isaccessible);
// 从lambda信息取出method、field、class等
string fieldname = serializedlambda.getimplmethodname().substring("get".length());
fieldname = fieldname.replacefirst(fieldname.charat(0) + "", (fieldname.charat(0) + "").tolowercase());
field field;
try {
field = class.forname(serializedlambda.getimplclass().replace("/", ".")).getdeclaredfield(fieldname);
} catch (classnotfoundexception | nosuchfieldexception e) {
throw new runtimeexception(e);
}
// 从field取出字段名,可以根据实际情况调整
tablefield tablefield = field.getannotation(tablefield.class);
if (tablefield != null && tablefield.value().length() > 0) {
return tablefield.value();
} else {
return fieldname.replaceall("[a-z]", "_$0").tolowercase();
}
}
}
建一些业务代码进行测试
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 tablefield {
string value() default "";
}
import java.io.serializable;
/**
* 用户实体类。测试用
*/
public class user implements serializable {
private string loginname;
@tablefield("nick")
private string nickname;
public string getloginname() {
return loginname;
}
public void setloginname(string loginname) {
this.loginname = loginname;
}
public string getnickname() {
return nickname;
}
public void setnickname(string nickname) {
this.nickname = nickname;
}
}
/**
* 测试用
*/
public class test {
public static void main(string[] args) {
system.out.println("字段名:" + columnutil.getname(user::getloginname));
system.out.println("字段名:" + columnutil.getname(user::getnickname));
}
}
运行结果:
字段名:login_name
字段名:nick
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!