Java8通过Function获取字段名的方法(获取实体类的字段名称)
看似很鸡肋其实在某些特殊场景还是比较有用的。
比如你将实体类转Map或者拿到一个Map结果的时候,你是怎么获取某个map的key和value。
方法一:
声明 String key1="aaa";
key为 key1,value 为map.get(key1);
Map map=new HashMap<>(); map.put("aaa",1); //获取map的key 和value//key 为key1String key1="aaa"; //value 为 map.get(key1)map.get(key1);
然后好像日常使用中也没有其他的方法了,下面将带来另外一种使用方法,话不多说直接上代码[/code]
import java.io.Serializable; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.invoke.SerializedLambda; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.function.Function; /** * Java8通过Function函数获取字段名称(获取实体类的字段名称) * @see ColumnUtil#main(java.lang.String[]) 使用示例 * @author jx */public class ColumnUtil {/*** 使Function获取序列化能力*/@FunctionalInterfacepublic interface SFunctionextends Function , Serializable {}/*** 字段名注解,声明表字段*/@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface TableField {String value() default ""; }//默认配置static String defaultSplit = ""; static Integer defaultToType = 0; /*** 获取实体类的字段名称(实体声明的字段名称)*/public static String getFieldName(SFunction fn) {return getFieldName(fn, defaultSplit); }/*** 获取实体类的字段名称* @param split 分隔符,多个字母自定义分隔符*/public static String getFieldName(SFunction fn, String split) {return getFieldName(fn, split, defaultToType); }/*** 获取实体类的字段名称* @param split 分隔符,多个字母自定义分隔符* @param toType 转换方式,多个字母以大小写方式返回 0.不做转换 1.大写 2.小写*/public static String getFieldName(SFunction fn, String split, Integer toType) {SerializedLambda serializedLambda = getSerializedLambda(fn); // 从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 {//0.不做转换 1.大写 2.小写switch (toType) {case 1:return fieldName.replaceAll("[A-Z]", split + "$0").toUpperCase(); case 2:return fieldName.replaceAll("[A-Z]", split + "$0").toLowerCase(); default:return fieldName.replaceAll("[A-Z]", split + "$0"); }}}private static SerializedLambda getSerializedLambda(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); return serializedLambda; }/*** 测试用户实体类*/public static class TestUserDemo implements Serializable {private static final long serialVersionUID = 1L; private String loginName; private String name; private String companySimpleName; @ColumnUtil.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 static long getSerialVersionUID() {return serialVersionUID; }public String getName() {return name; }public void setName(String name) {this.name = name; }public String getCompanySimpleName() {return companySimpleName; }public void setCompanySimpleName(String companySimpleName) {this.companySimpleName = companySimpleName; }}/*** 参考示例*/public static void main(String[] args) {//实体类原字段名称返回System.out.println(); System.out.println("实体类原字段名称返回"); System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getLoginName)); System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getNickName)); System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName)); System.out.println(); System.out.println("实体类字段名称增加分隔符"); System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_")); System.out.println(); System.out.println("实体类字段名称增加分隔符 + 大小写"); System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_", 0)); System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_", 1)); System.out.println("字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_", 2)); }}
输出结果:
文章图片
【Java8通过Function获取字段名的方法(获取实体类的字段名称)】到此这篇关于Java8通过Function获取字段名(获取实体类的字段名称)的文章就介绍到这了,更多相关Java8通过Function获取字段名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- PPT怎么在线转换成PDF
- 编译器通过
- Cocos2d-x3.3RC0通过JNI调用Android的Java层URI代码发送短信
- 雨林木风WIN8专业版无法通过检测器修好文件怎样办?
- 如何通过插槽看电脑能升级啥处理器?
- C++用户自定义的异常
- 如何通过5个步骤为你的下一个项目编写产品需求文档(PRD)
- Win8.1专业版通过路由器查看电脑流量的技巧
- C# try-catch用法
- AssertionError: View function mapping is overwriting an existing endpoint function: admin.main