java 取字段_Java8通过Function获取字段名

摘要: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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值