[JAVA]反射机制按顺序获取getDeclaredFields()/getDeclaredMethods()
2017-11-12 12:00
411 查看
>未知的返回顺序
在JDK的API文档里明确标注了:不能保证getDeclaredFields()/getDeclaredMethods()返回的Fields[] 和 Methods[] 的顺序。注意是不能保证返回顺序,而不是返回是乱序:它完全可能是乱序,也还可能是按照声明顺序排布。
这是因为,JVM有权在编译时,自行决定类成员的顺序,不一定要按照代码中的声明顺序来进行编译。因此返回的顺序其实是class文件中的成员正向顺序,只不过在编译时这个顺序不一定等于声明时的顺序。
那么如果我要按顺序获取Fields和Methods该怎么做呢?
>利用运行时的注解保证返回顺序
我们以按顺序获取Fields为例,先定义一个注解:
接下来就是最重要的排序方法了。想来大家都用上最新的JDK1.8了,那么这个方法可以这么写:
在JDK的API文档里明确标注了:不能保证getDeclaredFields()/getDeclaredMethods()返回的Fields[] 和 Methods[] 的顺序。注意是不能保证返回顺序,而不是返回是乱序:它完全可能是乱序,也还可能是按照声明顺序排布。
这是因为,JVM有权在编译时,自行决定类成员的顺序,不一定要按照代码中的声明顺序来进行编译。因此返回的顺序其实是class文件中的成员正向顺序,只不过在编译时这个顺序不一定等于声明时的顺序。
那么如果我要按顺序获取Fields和Methods该怎么做呢?
>利用运行时的注解保证返回顺序
我们以按顺序获取Fields为例,先定义一个注解:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface BeanFieldAnnotation { /** * 标注该属性的顺序 * @return 该属性的顺序 */ int order(); }然后给你所需要按顺序排布的Fields打上这个注解,比如:
public final class MyBean { @BeanFieldAnnotation(order = 1) private String number; @BeanFieldAnnotation(order = 2) private String dates; }
接下来就是最重要的排序方法了。想来大家都用上最新的JDK1.8了,那么这个方法可以这么写:
private List<Field> getOrderedField(Field[] fields){ // 用来存放所有的属性域 List<Field> fieldList = new ArrayList<>(); // 过滤带有注解的Field for(Field f:fields){ if(f.getAnnotation(BeanFieldAnnotation.class)!=null){ fieldList.add(f); } } // 这个比较排序的语法依赖于java 1.8 fieldList.sort(Comparator.comparingInt( m -> m.getAnnotation(BeanFieldAnnotation.class).order() )); return fieldList; }这个方法将直接返回按注解BeanFieldAnnotation中order属性指定顺序排布的Field的List(如果某个属性没有这个注解则跳过)。
相关文章推荐
- java 反射机制 之 getMethods获取所有公有方法 和 getDeclaredMethods 获取本类所有方法
- java 反射机制 之 getMethod获取公有方法 getDeclaredMethod获取所有方法 然后invoke执行其所有方法
- JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别 关于获取类的字段有两种方式:getFields()和getDeclaredFields()
- java 反射机制 之 getDeclaredField 获取私有保护字段, 再setAccessible(true)取消对权限的检查 实现对私有的访问和赋值
- java 反射机制 (获取父类泛型的类型)getGenericSuperclass
- Java反射 getFields()和getDeclaredFields()
- Java 反射机制中 getMethod()和getDeclaredField()区别
- java反射中getDeclaredMethods和getMethods的区别
- Java反射代码 得到某类的所有字段 getFields()与getDeclaredFields()区别 getMethod()和getDeclaredMethod()区别
- java反射中getDeclaredMethods和getMethods的区别
- Java反射 : Declared的作用 ( 例如 : getMethods和getDeclaredMethods )
- java反射中getDeclaredMethods和getMethods的区别
- Java 反射机制中 getMethod()和getDeclaredField()区别
- java 反射机制 (获取父类泛型的类型)getGenericSuperclass
- Java反射 getFields()和getDeclaredFields()的区别
- Java反射 getFields()和getDeclaredFields()的区别
- Java反射getMethods()与getDeclaredMethods()区别
- java反射---getDeclaredFields()与getFields()的区别
- Java,反射的用法,getDeclaredMethods与getMethods 的区别
- Java 反射(Reflection) - Class 类 getMethod、getMethods、getDeclaredMethod、getDeclaredMethods四者区别