[JAVA]反射机制按顺序获取getDeclaredFields()/getDeclaredMethods()

>未知的返回顺序

     在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(如果某个属性没有这个注解则跳过)。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值